2010-12-27 8 views
1

私は、どの順列が処理時間の点で最も速いのかを知るために、拡張メソッドの効率をテストしています。この時点でのメモリ消費は問題ではありません。拡張メソッドのパフォーマンスの測定。これは正しいですか?

ランダムな文字列の配列を生成するための小さなコンソールアプリケーションを作成しました。これに拡張メソッドが適用されています。私は現在、拡張メソッドを実行するのにかかる時間を測定するためにStopWatchクラスを使用しています。次に、各メソッドの合計時間の平均を何回か繰り返します。

この時点で最高または最低の結果を除外しません。

拡張メソッドがテストされている

public static String ToString1(this String[] s) { 
    StringBuilder sb = new StringBuilder(); 
    foreach (String item in s) { 
     sb.AppendLine(item); 
    } 
    return sb.ToString(); 
} 

public static String ToString2(this String[] s) {    
    return String.Join("\n", s); 
} 

Program.csの

static void Main(string[] args) 
{ 
    long s1Total = 0; 
    long s2Total = 0; 
    double s1Avg = 0; 
    double s2Avg = 0; 
    int iteration = 1; 
    int size = 100000; 

    while (iteration <= 25) 
    { 
     Console.WriteLine("Iteration: {0}", iteration); 
     Test(ref s1Total, ref s2Total, ref iteration, size); 
    } 

    s1Avg = s1Total/iteration; 
    s2Avg = s2Total/iteration; 

    Console.WriteLine("Version\t\tTotal\t\tAvg"); 
    Console.WriteLine("StringBuilder\t\t{0}\t\t{1}",s1Total, s1Avg); 
    Console.WriteLine("String.Join:\t\t{0}\t\t{1}",s2Total, s2Avg); 

    Console.WriteLine("Press any key.."); 
    Console.ReadKey(); 
} 

private static void Test(ref long s1Total, ref long s2Total, ref int iteration, int size) 
{ 
    String[] data = new String[size]; 
    Random r = new Random(); 

    for (int i = 0; i < size; i++) 
    { 
     data[i] = r.NextString(50); 
    } 

    Stopwatch s = new Stopwatch(); 

    s.Start(); 
    data.ToString1(); 
    s.Stop(); 
    s1Total += s.ElapsedTicks; 

    s.Reset(); 

    s.Start(); 
    data.ToString2(); 
    s.Stop(); 
    s2Total += s.ElapsedTicks; 

    iteration++; 
} 

その他の拡張完全なものにするため、上記のコードで使用する方法..

ランダム拡張子:

public static String NextString(this Random r,int size) 
{ 
    return NextString(r,size,false); 
} 

public static String NextString(this Random r,int size, bool lowerCase) 
{   
    StringBuilder sb = new StringBuilder();    
    char c; 
    for (int i = 0; i < size; i++) 
    { 
     c = Convert.ToChar(Convert.ToInt32(Math.Floor(26*r.NextDouble() + 65))); 
     sb.Append(c); 
    } 
    if (lowerCase) { 
     return sb.ToString().ToLower(); 
    } 
    return sb.ToString();   
} 

上記のコードを実行すると、StringBuilderベースのメソッドがString.Joinベースのメソッドより高速であることがわかりました。

私の質問は:これはこのタイプの測定を実行するための正しい方法 ..です は、これを行うのより良い方法はありますか? この例の結果は正しいですか?そうであれば、この状況で実際にString.Joinよりも速いStringBuilderを使用していますか?

ありがとうございました。

答えて

4

次回は、パフォーマンスを比較したいときに、リフレクターを介してソースコードを見ることができます。 がStringBuilderを使用して文字列を構成していることが簡単にわかります。だから彼らはわずかなパフォーマンスの違いがあります。

+0

Monoプロジェクトに貢献したいと思っている人々に関するパブリックフォーラムにMicrosoft .NET Frameworkのソースコードを投稿しないでください。http://mono-project.com/Contributing –

+0

@PauliØsterø:ありがとうございますあなたのアドバイス。私の答えを変更しました。 –

2

私はToString1は余分な改行を追加すること

StringBuilder 3428567 131867 
String.Join: 1245078 47887

注意を得ました。
また、StringBuilderの容量を設定することで、これを改善できます。

+0

私は完全な反対を得る..行く図.. –