3

我是 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。

丁:

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。

我究竟做错了什么?谢谢!

4

4 回答 4

9

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

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

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

于 2013-01-12T23:43:37.297 回答
8

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

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

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

DMD ~905ms, LDC ~663ms, GDC ~382ms

Java ~445ms

g++ ~370ms under -O3

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

于 2013-01-15T18:09:13.967 回答
2

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

于 2013-01-12T23:51:49.540 回答
1

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

于 2013-01-13T02:27:06.767 回答