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
-
前の記事
ruby 配列の値を順番に変数に代入する 2023.02.13
-
次の記事
Rust ベクタ(可変配列)の値を任意の数で順番に区切る 2023.02.13
コメントを書く