8

編集:問題を解決しました。原因はテスト手順の誤りであり、私自身の質問に回答できるようになったら詳しく説明します。

この種の質問は一般的に避けるべきであることはわかっていますが、理解できない非常に奇妙な状況に遭遇しました。私は PRNG を実装しようとしており、そのパフォーマンスを System.Random に対してテストしています。私のコードは最大 50 倍遅いことがわかりましたが、問題はアルゴリズムではなく、メソッドを呼び出すだけでした。定数を返しただけでも、何倍も遅くなります。

そこで、random.NextDouble() をラップするメソッド (-1 を返すメソッド) の呼び出しと、random.NextDouble() の直接呼び出しを比較する簡単なテスト プログラムを作成します。テストを Ideone で実行したところ、期待どおりの結果が得られました。すべての時間は似ていて、定数を返すのが最速でした。タイムはすべて0.1秒前後でした。

ただし、Visual Studio 2011 Beta または 2010 C# Express でコンパイルされた同じコードは、それぞれのケースで 4 秒、4 秒、0.1 秒になります。私は間違いなくリリースモードで実行しており、コードの最適化チェックボックスにチェックが入っており、Visual Studio の外部から起動しても同じ結果が得られます。では、Visual Studio では、このような単純なメソッド呼び出しが Ideone よりもはるかに遅いのはなぜでしょうか? ベンチマークに使用したコードは次のとおりです。

using System;
using System.Diagnostics;

public class Test{
    static Random random = new Random();

    public static Double Random() {
        return random.NextDouble();
    }

    public static Double Random2() {
        return -1;
    }

    public static void Main() {
        {
            Stopwatch s = new Stopwatch();
            Double a = 0;
            s.Start();
            for (Int32 i = 0; i < 5000000; i++)
                a += Random();
            s.Stop();
            Console.WriteLine(s.ElapsedMilliseconds);
        }

        {
            Stopwatch s = new Stopwatch();
            Double a = 0;
            s.Start();
            for (Int32 i = 0; i < 5000000; i++)
                a += Random2();
            s.Stop();
            Console.WriteLine(s.ElapsedMilliseconds);
        }

        {
            Stopwatch s = new Stopwatch();
            Double a = 0;
            s.Start();
            for (Int32 i = 0; i < 5000000; i++)
                a += random.NextDouble();
            s.Stop();
            Console.WriteLine(s.ElapsedMilliseconds);
        }
    }
}
4

1 に答える 1

2

Random() および Random2() への最初の呼び出しを測定しないでください。関数が初めて呼び出されると、JITTER によって処理されます。代わりに、Random() と Random2() を 1 回呼び出してから、測定を開始します。random.NextDouble() は .NET のインストール後に既にコンパイルされているため、同じ問題は発生しません。

これですべての違いが説明できるとは思いませんが、公平な競争条件になるはずです。

于 2012-04-08T20:04:03.060 に答える