C# 在使用循环访问内存时比 Java 慢一半?

标签 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);

它只是列举了所有可能的 7 种卡片组合。除了最后使用 Console.writeLine 之外,C# 版本是相同的。

查找表定义为:

static int handRanksj[];

它在内存中的大小约为 120 MB。

C#版本有相同的测试代码。它是用秒表而不是 nanoTime() 测量的,并使用 Console.WriteLine 而不是 System.out.println("") 但它至少需要两倍的时间。

Java 大约需要 400 毫秒。对于在 Java 中的编译,我使用 -server 标志。在 C# 中,build设置为不带调试或跟踪定义的发布。

造成速度差异的原因是什么?

最佳答案

如果您在 Visual Studio 中为 C# 调试构建或发布构建计时,您将会得到非常具有误导性的计时。在 Release 模式下编译并从命令行运行或在 Visual Studio 中运行而不调试。也就是说,不是 F5 运行,而是按 Ctrl+F5 运行而不调试。

关于C# 在使用循环访问内存时比 Java 慢一半?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276018/

相关文章:

php - 如何设计插件系统才不会浪费那么多资源?

c# - 为什么将其实现为结构?

c# - 接口(interface)类型可以包括哪些类型?

java - 为什么在 HashMap 中找不到 key ?

java - 将光标设置为 JTextfield

Java:导出到 JAR 后路径名不起作用

c# - AesCryptoServiceProvider,性能问题

javascript - Table 和 3000+ tr 的 AngularJs 性能问题?

c# - 保护客户的 VS2015 解决方案

c# - 在线查看 .rdl 文件