加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#在内存访问循环中比Java慢一半?

发布时间:2020-12-15 17:48:09 所属栏目:百科 来源:网络整理
导读:我有两个代码在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
我有两个代码在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#中,构建设置为没有调试或跟踪定义而释放.

什么负责速度差异?

解决方法

如果您正在计时C#Debug构建或Visual Studio中的发布版本,您将获得非常误导的时间.在释放模式下编译,并从命令行运行或在Visual Studio中运行而不进行调试.也就是说,而不是F5运行,按Ctrl F5运行而不进行调试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读