10

C# と Java で同一の 2 つのコードがあります。しかし、Java の方が 2 倍高速です。理由を知りたいです。どちらも、パフォーマンスのために大きなルックアップ テーブルを使用するという同じ原理で動作します。

Java が C# よりも 50% 速いのはなぜですか?

Java コード:

    int h1, h2, h3, h4, h5, h6, h7;
    int u0, u1, u2, u3, u4, u5;
    long time = System.nanoTime();
    long sum = 0;
    for (h1 = 1; h1 < 47; h1++) {
        u0 = handRanksj[53 + h1];
        for (h2 = h1 + 1; h2 < 48; h2++) {
            u1 = handRanksj[u0 + h2];
            for (h3 = h2 + 1; h3 < 49; h3++) {
                u2 = handRanksj[u1 + h3];
                for (h4 = h3 + 1; h4 < 50; h4++) {
                    u3 = handRanksj[u2 + h4];
                    for (h5 = h4 + 1; h5 < 51; h5++) {
                        u4 = handRanksj[u3 + h5];
                        for (h6 = h5 + 1; h6 < 52; h6++) {
                            u5 = handRanksj[u4 + h6];
                            for (h7 = h6 + 1; h7 < 53; h7++) {
                                sum += handRanksj[u5 + h7];
    }}}}}}}
    double rtime = (System.nanoTime() - time)/1e9; // time given is start time
    System.out.println(sum);

可能なすべての 7 枚のカードの組み合わせを列挙するだけです。C# のバージョンは、最後に Console.writeLine を使用する以外は同じです。

ルックアップ テーブルは次のように定義されます。

static int handRanksj[];

メモリ内のサイズは約 120 メガバイトです。

C# バージョンには同じテスト コードがあります。nanoTime() の代わりに Stopwatch で測定され、代わりに使用Console.WriteLineSystem.out.println("")れますが、少なくとも 2 倍の時間がかかります。

Java は約 400ms かかります。Java でのコンパイルには -server フラグを使用します。C# では、ビルドはデバッグまたはトレース定義なしでリリースに設定されます。

速度の違いの原因は何ですか?

4

2 に答える 2

10

Visual Studio 内から C# デバッグ ビルドまたはリリース ビルドのタイミングを計っている場合、非常に誤解を招くタイミングになります。リリース モードでコンパイルし、コマンド ラインから実行するか、デバッグなしで Visual Studio で実行します。つまり、F5 で実行するのではなく、Ctrl+F5 を押してデバッグなしで実行します。

于 2011-03-11T17:27:41.447 に答える
1

それらの1つが配列内のシーケンシャルメモリ(つまり、隣接する要素)に順番にアクセスしている間に、もう1つがあちこちに跳ね返っている可能性はありますか? その場合、それらの 1 つは、隣接する配列要素をプリフェッチするプロセッサから深刻なブーストを受け取りますが、もう 1 つは受け取りません。

とはいえ、ポーカー ハンド シミュレーターを実行する場合は、代わりにモンテカルロ シミュレーションを試してください。ハンドの結果は、考えられる 7 枚のカードの組み合わせをすべて試す前に収束します。

カード オブジェクトのデッキを使用する場合は、ハンドとボードを現在の値に固定し、デッキからランダムにボードを配り、シャッフルし、x 回繰り返します。すべての可能性を列挙するずっと前に、値は実際の確率に収束するはずです。

于 2011-03-11T17:18:02.083 に答える