D lang简单的基准测试

时间:2013-01-12 22:39:19

标签: java benchmarking d

我是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 64位,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。

我做错了什么? 谢谢!

3 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:2)

DMD的后端不会像基于GCC的GDC或基于LLVM的LDC那样进行优化。使用GDC构建时,我的测试程序运行速度比Java略快。如果性能对您的项目很重要,请不要将DMD用于发布版本。

答案 2 :(得分:1)

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