在使用循环的内存访问中,C#的速度是Java的一半吗?

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运行而不调试.

  • 在我使用F5以发布模式运行它时进行批处理的C#控制台应用程序,初始化到我的任务运行器是很重要的,等待超过40-50秒.一旦我发布并从磁盘运行相同的文件,它就会<1s. (4认同)