この質問は、他のポスターがそれを明らかにしたほど単純ではありません(そして私が最初に信じていたように)-質問は必要なほど正確ではないためです。
「スペース」と「ホワイトスペース」には違いがあります。スペースのみを意味する場合は、の正規表現を使用する必要があり" {2,}"
ます。空白を意味する場合、それは別の問題です。すべての空白をスペースに変換する必要がありますか?開始時と終了時のスペースはどうなりますか?
以下のベンチマークでは、スペースだけを気にし、最初と最後であっても、単一のスペースには何もしたくないと仮定しました。
ほとんどの場合、パフォーマンスよりも正確さが重要であることに注意してください。Split / Joinソリューションが先頭/末尾の空白(単一のスペースだけでも)を削除するという事実は、指定された要件(もちろん不完全な場合もあります)に関する限り正しくありません。
ベンチマークはMiniBenchを使用します。
using System;
using System.Text.RegularExpressions;
using MiniBench;
internal class Program
{
public static void Main(string[] args)
{
int size = int.Parse(args[0]);
int gapBetweenExtraSpaces = int.Parse(args[1]);
char[] chars = new char[size];
for (int i=0; i < size/2; i += 2)
{
// Make sure there actually *is* something to do
chars[i*2] = (i % gapBetweenExtraSpaces == 1) ? ' ' : 'x';
chars[i*2 + 1] = ' ';
}
// Just to make sure we don't have a \0 at the end
// for odd sizes
chars[chars.Length-1] = 'y';
string bigString = new string(chars);
// Assume that one form works :)
string normalized = NormalizeWithSplitAndJoin(bigString);
var suite = new TestSuite<string, string>("Normalize")
.Plus(NormalizeWithSplitAndJoin)
.Plus(NormalizeWithRegex)
.RunTests(bigString, normalized);
suite.Display(ResultColumns.All, suite.FindBest());
}
private static readonly Regex MultipleSpaces =
new Regex(@" {2,}", RegexOptions.Compiled);
static string NormalizeWithRegex(string input)
{
return MultipleSpaces.Replace(input, " ");
}
// Guessing as the post doesn't specify what to use
private static readonly char[] Whitespace =
new char[] { ' ' };
static string NormalizeWithSplitAndJoin(string input)
{
string[] split = input.Split
(Whitespace, StringSplitOptions.RemoveEmptyEntries);
return string.Join(" ", split);
}
}
いくつかのテスト実行:
c:\Users\Jon\Test>test 1000 50
============ Normalize ============
NormalizeWithSplitAndJoin 1159091 0:30.258 22.93
NormalizeWithRegex 26378882 0:30.025 1.00
c:\Users\Jon\Test>test 1000 5
============ Normalize ============
NormalizeWithSplitAndJoin 947540 0:30.013 1.07
NormalizeWithRegex 1003862 0:29.610 1.00
c:\Users\Jon\Test>test 1000 1001
============ Normalize ============
NormalizeWithSplitAndJoin 1156299 0:29.898 21.99
NormalizeWithRegex 23243802 0:27.335 1.00
ここで、最初の数値は反復回数、2番目の数値は所要時間、3番目の数値はスケーリングされたスコアであり、1.0が最良です。
これは、少なくとも一部のケース(これを含む)では、正規表現が分割/結合ソリューションよりもパフォーマンスが優れている場合があり、場合によっては非常に大きな差があることを示しています。
ただし、「すべての空白」要件に変更すると、分割/結合が優先されるように見えます。よくあることですが、悪魔は詳細に宿っています...