C# 文字列が半角の数値であるかの判定で「Regex.IsMatch」と「char.IsDigit」と「Int32.TryParse」と「foreach」のパフォーマンスを計測して比較する

  • 作成日 2023.02.13
  • C#
C# 文字列が半角の数値であるかの判定で「Regex.IsMatch」と「char.IsDigit」と「Int32.TryParse」と「foreach」のパフォーマンスを計測して比較する

C#で、文字列が半角の数値であるかの判定処理を「Regex.IsMatch」と「char.IsDigit」と「Int32.TryParse」と「foreach」のそれぞれで実行したパフォーマンスを計測して比較するコードと結果を記述してます。「foreach」を使用するのが良さそうです。

環境

  • OS windows10 pro 64bit
  • Microsoft Visual Studio Community 2022 Version 17.2.3

パフォーマンス計測

「System.Diagnostics.Stopwatch」を使用して、文字列が半角の数値であるかの判定処理で「Regex.IsMatch」と「char.IsDigit」と「Int32.TryParse」と「foreach」を100万回実行して、計測した結果を比較してみます。

using System;
using System.Text.RegularExpressions;
using System.Linq;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int n = 1_000_000;

            string txt = "123456789";
            int num;
            Boolean a, b, c, d;
            TimeSpan ts;

            var time = new System.Diagnostics.Stopwatch();

            // 計測開始
            time.Start();

            for (int i = 0; i < n; i++)
            {
                a = Regex.IsMatch(txt, @"^[0-9]+$");
            }

            time.Stop();

            ts = time.Elapsed;

            System.Diagnostics.Debug.WriteLine($"Regex.IsMatch : {time.ElapsedMilliseconds}ms");


            // 計測開始
            time.Reset(); // リセット
            time.Start();

            for (int i = 0; i < n; i++)
            {
                b = txt.All(char.IsDigit);
            }

            time.Stop();

            ts = time.Elapsed;

            System.Diagnostics.Debug.WriteLine($"(char.IsDigit : {time.ElapsedMilliseconds}ms");

            // 計測開始
            time.Reset(); // リセット
            time.Start();

            for (int i = 0; i < n; i++)
            {
                c = Int32.TryParse(txt, out num);
            }

            time.Stop();

            ts = time.Elapsed;

            System.Diagnostics.Debug.WriteLine($"Int32.TryParse : {time.ElapsedMilliseconds}ms");

            // 計測開始
            time.Reset(); // リセット
            time.Start();

            for (int i = 0; i < n; i++)
            {
                foreach (char ch in txt)
                {
                    if (ch >= '0' && ch <= '9')
                    {
                        d = true;
                    }
                }
                d = false;
            }

            time.Stop();

            ts = time.Elapsed;

            System.Diagnostics.Debug.WriteLine($"foreach : {time.ElapsedMilliseconds}ms");

        }
    }
}

実行結果をみると「foreach」を使用するのが一番速そうです。

【1回目】
Regex.IsMatch : 367ms
(char.IsDigit : 35ms
Int32.TryParse : 63ms
foreach : 16ms

【2回目】
Regex.IsMatch : 504ms
(char.IsDigit : 65ms
Int32.TryParse : 80ms
foreach : 40ms

【3回目】
Regex.IsMatch : 474ms
(char.IsDigit : 66ms
Int32.TryParse : 80ms
foreach : 35ms