2016-12-19 17 views
0

最近、私は簡単な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とそれを実行します。シンプルなコンソールアプリケーション。

私はまだ非常に愚かなタイプミスをしたと思いますが、私はそれを見つけることができません。私のメソッドが正しい結果を返すのにも役立ちません。

+0

私はプロキシの制限のためにpastebinからあなたのコードを見ることができませんが、普通のIndexOfメソッドは文化に敏感な比較をしています。質問の一部としてコードを投稿することを検討してください。 –

+1

私はあなたのコードをテストしましたが、バージョン4xと比較して、フレームワークのバージョン3xのパフォーマンスの差異を実際に見ることができます。リリースx64、標準ライブラリのバージョン3は私にとっては約42ミリ秒、バージョン4.6.1は約176ミリ秒でした。なぜあなたに気づかないのか分かりません。 – Nick

+0

私が言ったように、IndexOfはあなたがそれを使用する方法で、毎回別の内部呼び出しで文化を指定します。たぶんあなたがそれをあなた自身で指定するなら、それは少し節約するかもしれません。 ちょうど数ミリ秒の間、それを最適化しようとしていません...あなたが本当にしたい場合は、ネイティブウィンドウ関数を使用してインデックスを取得してください。これは、.NETが内部的に行う多くのコードを節約します。 詳細については、CompareInfo.IndexOfのソースコードを参照してください。 – Viezevingertjes

答えて

-1

あなたのコードは、3つのテストのうち2つ(リリースモード)のために私のマシン(.Net 4、.Net 4.6.1、.Net 3.5両方)の標準よりも遅いです。

はまた、Microsoftの実装は、より多くの時間がかかるより多くのことを行い注意ください:

  • 彼らは、入力検証の多くを持っている(ArgumentOutOfRangeExceptionArgumentNullException ....などをスローします。)。これは、litterally何千回実行されているため、これはテストされたコードの影響が大きいです。
  • 彼らは何が価値があるために比較オプション

here is their current implementationを持って

  • 考慮に文化を取ります。あなたは自分のコードIMOで実際にはうまくいくことはできません。

  • +0

    ああ、これは本当に奇妙です。なぜなら私はリリースモードのバイナリが互いに無関係の5つの異なるマシンでテストしたからです。これは、このプロジェクトだけでなく、他の多くのベンチマークも今回も間違っていたことを示しているので、本当に奇妙です。私は、単純なbrutforceは、最もパフォーマンスの高いアルゴリズムを使用するネイティブの実装と比べて速くすべきではないことを理解しています。 – GuardianX

    関連する問題