2012-01-16 10 views
2

私はカスタムのindexOf関数を使用して小さなプログラムを作成しましたが、システムのstring.IndexOf()メソッドを使用してそれを閉じたいと思っていました。私はリファクタリングを開始する前にindexOf()のパフォーマンスと同じことをする関数ループとの比較

は、しかし、私はちょうど私が観察し何

は事実だった私の機能は、システムstring.IndexOf()の比較において行動してどのように悪い見る見るために好奇心から小さ​​なテストプログラムを書いたそのシステム列.IndexOf は、のように、配列を反復するよりも遅いです。

Processing random random string at 1000000 characters. 
Processing method 1 system string.IndexOf 
index 999999 took 620036 ticks 
Processing method 2 custom IndexOf 
index 999999 took 130007 ticks 

私の質問は本当にです。 私は間違っているのですか?私はC#で書いたものよりもはるかに速いシステム機能はありませんか?

TL; DR 試験シナリオ

最初私は、いくつかのテストデータを設定し、いくつかのデータ

StringBuilder sb = new StringBuilder(); 
Random r = new Random(); 
string c = "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ"; 
long before; 
long after; 
for (int i = 0; i < 1000000; i ++) sb.Append(c[r.Next(c.Length)]); 

とランダムな文字列を充填した後の終わりに何かを挿入します検索したいアレイ、最悪のケース

int j = sb.Length - 1 ;         
sb[j] = '"'; 

方法1:システムstring.IndexOf

し、システムstring.IndexOf()

before = DateTime.Now.Ticks; 
index = text.IndexOf("\""); 
after = DateTime.Now.Ticks; 

方法2によって使用されるどのように多くのダニチェック:

と後カスタムメソッドカスタムコードを実行するのは、静的な関数であり、whileループは文字配列を反復処理するというものです。

before = DateTime.Now.Ticks; 
index = IndexOf(text, 0, '"', '/'); 
after = DateTime.Now.Ticks; 
+9

いずれにしても、ベンチマークとは異なります。 – delnan

+8

まず、ベンチマークに 'Stopwatch'を使うべきです。これは' DateTime'よりも優れた解決策です。 – Oded

+0

'IndexOf()'の実装はどのように見えますか? – Magnus

答えて

5

私はここでの違いは、あなたがString.IndexOfを呼び出しているときに、文字列リテラルを使用している、とカスタム関数リテラル文字を使用していることだと思います。

カスタム実装を見ていないと、String.IndexOfメソッドがより正確であると推測できます(ロケール、ユニコードなど)。

1)あなたは文字列の検索

2対IndexAtの文字を探している)より正確な比較を行うには:あなたの関数がどのように動作するか、起こっていくつかのことができる知らない

+0

技術的には、ロケールはローカルではありません。私はあなたのためにそれを固定:) –

1

あなたの検索語をランドームの場所に置き、数十回の繰り返しを実行します。あなたの勝利は最悪のケースかもしれませんが、図書館は残りの時間に勝ちます。

3)もちろん、ライブラリはあらゆるソリューションに最適化されています。

5

String.IndexOfも、パラメータとしてcharを受け入れるオーバーロードを持っていることを確認するだけでLINQを見てください。これを試してみてください。独自の実装では、charが使用されています(stringではありません)。

index = text.IndexOf('"'); 

あなたはテストを数回繰り返す必要があります。時には、最初の実行に時間がかかります。これは、メソッドがジッタされているか、静的メンバーが初期化されているか、そのようなものがあるためです。

for (i = 0; i < 10; i++) { 
    Test1(); 
    Test2(); 
} 
関連する問題