我有两个代码在C#和
Java中是相同的.但
Java的速度却是两倍.我想知道为什么两者都使用相同的主体来使用大型查找表来执行性能.
为什么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.
lookuptable定义为:
static int handRanksj[];
其内存大小约为120兆字节.
C#版本有相同的测试代码.它使用Stopwatch代替nanoTime()测量,并使用Console.WriteLine而不是System.out.println(“”),但至少需要两倍的时间.
Java需要大约400ms.为了在java中编译,我使用-server标志.在C#中,构建设置为没有调试或跟踪定义而释放.
什么负责速度差异?