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.WriteLine
さSystem.out.println("")
れますが、少なくとも 2 倍の時間がかかります。
Java は約 400ms かかります。Java でのコンパイルには -server フラグを使用します。C# では、ビルドはデバッグまたはトレース定義なしでリリースに設定されます。
速度の違いの原因は何ですか?