【问题标题】:D lang simple benchmarkingD lang 简单的基准测试
【发布时间】:2013-01-12 22:39:18
【问题描述】:

我是 D 的新手,我在简单的测试中将它与 Java 进行比较,并期望看到本机语言会更快(或大致相同)。但在我第一次使用递归 D 的测试中,它比 Java 慢(几乎两倍)。

Java(这是一个糟糕的 Java 性能测试,但它只是一个简单的想法):

public static void main(String... args) {
        long before = System.nanoTime();
        System.out.println(fibonacci(40));
        System.out.println(TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - before));
    }

    static int fibonacci(int n) {
        if (n < 2) {
            return n;
        }
        return fibonacci(n - 2) + fibonacci(n - 1);
    }

环境:Win7 64bit,JDK:1.7.0_10 x64。

D:

import std.stdio;
import std.datetime;

void main(string[] args)
{
    auto r = benchmark!(simplebench)(1);
    writefln("%s", r[0].to!("msecs", int));
}

void simplebench() {
    writeln(fibonacci(40));
}

int fibonacci(int n) {
    if (n < 2) {
        return n;
    }
    return fibonacci(n - 2) + fibonacci(n - 1);
}

环境:Win7 64bit,dmd 2.061,编译器选项:-noboundscheck -inline -O -release

Java ~570ms 和 D ~1011ms。

我做错了什么? 谢谢!

【问题讨论】:

  • a) Java 非常擅长算术,b) 也许 D 编译器不太好?
  • 我希望你选择了那个实现,因为它不是最优的......

标签: java benchmarking d


【解决方案1】:

Java 通过其 JIT 编译器也是原生的。如果您使用-Xint(强制解释器)禁用 JIT,那么您会发现 D 明显更快。值得一提的是,我在 C 中尝试了类似的实现,并获得了与 D 中相同的速度。

这些类型的微基准对测试一般性能没有用处。您在这里所做的只是测试 Java JIT 编译代码与 D 编译代码。他们都在编译。此外,这不是典型的 Java 代码。典型的 Java 程序会在堆上分配大量内存,而典型的 D 程序不会。

如果您想了解 D 与 Java 的真实性能,那么您需要在真实程序上对其进行测试。

【讨论】:

  • 还要确保您实际测试的是同一个程序
【解决方案2】:

DMD 是 D 的参考编译器,但它的后端生成代码的速度不如前面提到的 Cyber​​Shadow 的其他编译器 GDC 和 LDC。

在我的电脑上测量的时间:

D 编译器,全部使用以下标志或其等效项:-noboundscheck -inline -O -release

DMD ~905ms, 最不发达国家 ~663ms, GDC ~382ms

Java ~445ms

g++ ~370ms under -O3

这些(微)结果表明,当使用相同的后端编译时,D 代码与 cpp 等效的性能相同,并且比 Java 代码更快。

【讨论】:

    【解决方案3】:

    DMD 的后端优化不如基于 GCC 的 GDC 或基于 LLVM 的 LDC。当使用 GDC 构建时,您的测试程序对我来说比 Java 运行得稍微快一些。如果性能对您的项目很重要,请不要将 DMD 用于发布版本。

    【讨论】:

      【解决方案4】:

      你没有做错任何事。 Java 的 JIT 非常好,并且可能比 DMD 编译器更好地优化某些代码? - 尝试 GDC 或 LDC 编译器,看看生成的可执行文件的测试会给出什么样的结果。我也会测试 LuaJIT,并且我希望它使用这些处理 POD 的小算法会非常快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 2010-12-30
        相关资源
        最近更新 更多