C# 空白除去処理で「Regex.Replace」と「Linq(Concat・Char.IsWhiteSpace)」のパフォーマンスを計測して比較する

  • 作成日 2023.01.05
  • C#
C# 空白除去処理で「Regex.Replace」と「Linq(Concat・Char.IsWhiteSpace)」のパフォーマンスを計測して比較する

C#で、空白除去処理を「Regex.Replace」と「Linq(Concat・Char.IsWhiteSpace)」のそれぞれで100万回実行したパフォーマンスを計測して比較するコードと結果を記述してます。結果はわずかですが「Linq(Concat・Char.IsWhiteSpace)」を使用した方が良さそうです。

環境

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

パフォーマンス計測

「System.Diagnostics.Stopwatch」を使用して、同じ空白除去処理で「Regex.Replace」と「Linq(Concat・Char.IsWhiteSpace)」を100万回実行して、計測した結果を比較してみます。

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

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {

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

            int n = 1_000_000;

            string str = " he ll o w o   r   l d";
            string result;
            TimeSpan ts;

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

            for (int i = 0; i < n; i++)
            {
                result = Regex.Replace(str, @"\s", "");
            }

            time.Stop();

            ts = time.Elapsed;

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

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

            for (int i = 0; i < n; i++)
            {
                result = String.Concat(str.Where(x => !Char.IsWhiteSpace(x)));
            }

            time.Stop();

            ts = time.Elapsed;

            System.Diagnostics.Debug.WriteLine($"Linq(Concat:Char.IsWhiteSpace) : {time.ElapsedMilliseconds}ms");


        }
    }
}

実行結果をみると「Linq(Concat:Char.IsWhiteSpace)」の方がパフォーマンスは良さそうです。

【1回目】
Regex.Replace : 2769ms
Linq(Concat:Char.IsWhiteSpace) : 459ms

【2回目】
Regex.Replace : 2749ms
Linq(Concat:Char.IsWhiteSpace) : 551ms

【3回目】
Regex.Replace : 2768ms
Linq(Concat:Char.IsWhiteSpace) : 435ms