非常に長い文字列 (サイズが60MB ) があり、そこに '<' と '>' のペアがいくつあるかを見つける必要があります。
私は最初に自分の方法を試しました:
char pre = '!';
int match1 = 0;
for (int j = 0; j < html.Length; j++)
{
char c = html[j];
if (pre == '<' && c == '>') //find a match
{
pre = '!';
match1++;
}
else if (pre == '!' && c == '<')
pre = '<';
}
上記のコードは、私の文字列で約1000 ms実行されます。
それから私は使ってみましたstring.IndexOf
int match2 = 0;
int index = -1;
do
{
index = html.IndexOf('<', index + 1);
if (index != -1) // find a match
{
index = html.IndexOf('>', index + 1);
if (index != -1)
match2++;
}
} while (index != -1);
上記のコードは約150 ミリ秒しか実行されません。
こんなに速くstring.IndexOf
走れる魔法は何だろう?
誰でも私にインスピレーションを与えることができますか?
編集
@BrokenGlassの回答によると、わかりました。ペアリングをチェックしないようにコードを変更しました。代わりに、文字列内の「<」の数をチェックします。
for (int j = 0; j < html.Length; j++)
{
char c = html[j];
if (c == '>')
{
match1++;
}
}
上記のコードは約760 ミリ秒実行されます。
使用するIndexOf
int index = -1;
do
{
index = html.IndexOf('<', index + 1);
if (index != -1)
{
match2++;
}
} while (index != -1);
上記のコードは約132 ms実行されます。それでも非常に速い。
編集 2
@Jeffrey Sax のコメントを読んだ後、デバッグ モードで VS を実行していることに気付きました。
次に、リリースモードでビルドして実行しましたIndexOf
が、それでも高速ですが、それほど高速ではありません。
結果は次のとおりです。
ペアリング回数:207ms VS 144ms
通常の 1 文字カウントの場合: 141ms VS 111ms。
私自身のコードのパフォーマンスは本当に改善されました。
教訓: ベンチマークを実行するときは、リリース モードで実行してください。