mic*_*ael 10 c# java performance lookup-tables
我有两段在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);
Run Code Online (Sandbox Code Playgroud)
它只列举了所有可能的7种卡片组合.C#版本是相同的,除了最后它使用Console.writeLine.
查阅表定义为:
static int handRanksj[];
Run Code Online (Sandbox Code Playgroud)
它在内存中的大小约为120兆字节.
C#版本具有相同的测试代码.它是使用秒表而不是nanoTime()进行测量而是使用Console.WriteLine而不是,System.out.println("")但至少需要两倍的时间.
Java大约需要400毫秒.对于java中的编译,我使用-server标志.在C#中,构建设置为在没有调试或跟踪定义的情况下发布.
什么是速度差异?
Jim*_*hel 10
如果您在Visual Studio中对C#Debug构建或Release构建进行计时,则会产生非常误导性的时序.在发布模式下编译,可以从命令行运行,也可以在Visual Studio中运行而无需调试.也就是说,而不是运行F5,按Ctrl + F5运行而不调试.
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |