最近、私は簡単なbrutforce文字列検索を作成し、それをパフォーマンスのネイティブ.NET4実装と比較しようとしました。しかし、ネイティブの.NET 4+実装と比較して、私のカスタムメソッドでは、特定の状況下でx3パフォーマンスの向上が得られたので、私はショックを受けました。リリース・モードでは、すべてのバージョンの.NETフレームワークでテストされました。なぜネイティブ.net 4+ string IndexOfが.netよりも遅い3 -
何とか.NET 4+ String.IndexOfが非常に遅いです。だから私は古い.NET 3のバージョンでテストし、ネイティブの実装が最新の.NETリリースよりも本当に高速であることを発見しました。ここで
は、コードは次のとおりです。それのhttp://pastebin.com/GB5w7FXz
要旨は私のカスタムメソッドに対してネイティブメソッドの実行の多くをテストしている:
private static int FindSubstringCustom(string text, string substring)
{
int cachedTextLength = text.Length;
int cachedSubstringLength = substring.Length;
bool success = true;
for (int i = 0; i < cachedTextLength; ++i)
{
if (text[i] == substring[0])
{
success = true;
for (int j = 1; j < cachedSubstringLength; ++j)
{
if (text[i + j] != substring[j])
{
success = false;
break;
}
}
if (success)
{
return i;
}
}
}
return -1;
}
私は、Visual Studio 2015のCommunity Editionとそれを実行します。シンプルなコンソールアプリケーション。
私はまだ非常に愚かなタイプミスをしたと思いますが、私はそれを見つけることができません。私のメソッドが正しい結果を返すのにも役立ちません。
私はプロキシの制限のためにpastebinからあなたのコードを見ることができませんが、普通のIndexOfメソッドは文化に敏感な比較をしています。質問の一部としてコードを投稿することを検討してください。 –
私はあなたのコードをテストしましたが、バージョン4xと比較して、フレームワークのバージョン3xのパフォーマンスの差異を実際に見ることができます。リリースx64、標準ライブラリのバージョン3は私にとっては約42ミリ秒、バージョン4.6.1は約176ミリ秒でした。なぜあなたに気づかないのか分かりません。 – Nick
私が言ったように、IndexOfはあなたがそれを使用する方法で、毎回別の内部呼び出しで文化を指定します。たぶんあなたがそれをあなた自身で指定するなら、それは少し節約するかもしれません。 ちょうど数ミリ秒の間、それを最適化しようとしていません...あなたが本当にしたい場合は、ネイティブウィンドウ関数を使用してインデックスを取得してください。これは、.NETが内部的に行う多くのコードを節約します。 詳細については、CompareInfo.IndexOfのソースコードを参照してください。 – Viezevingertjes