D语言简单基准测试

3

我是D语言的新手,正在进行与Java的简单测试并期望看到本地语言会更快(或大致相同)。但在我的第一个递归测试中,D比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 64位,dmd 2.061编译器,编译选项为:-noboundscheck -inline -O -release

Java的运行时间约为570毫秒,而D语言则为1011毫秒。

我做错了什么?谢谢!


a) Java在算术方面表现相当不错。 b) 也许D编译器并不是很好? - Daniel Fischer
1
我希望你选择那个实现方式是因为它并不是最优的... - ratchet freak
4个回答

9

Java 也通过其JIT编译器本地支持。如果您使用 -Xint (强制解释器) 禁用JIT,则会发现D的速度显着更快。值得一提的是,我在C中尝试了类似的实现,得到了与D相同的速度。

这些微型基准测试对于测试通用性能并不有用。您所做的仅是测试Java JIT编译代码与D编译代码。它们都被编译。此外,这不是典型的Java代码。典型的Java程序在堆上分配大量内存,而典型的D程序不会这样做。

如果您想了解D与Java的真正性能差异,则需要在实际程序中进行测试。


请确保您正在测试相同的程序。 - ratchet freak

8

DMD是D语言的参考编译器,但其后端产生的代码速度不如其他编译器GDC和LDC快,正如CyberShadow之前所提到的。

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

D编译器,所有使用以下标志或它们的等效物:-noboundscheck -inline -O -release

DMD ~905毫秒, LDC ~663毫秒, GDC ~382毫秒

Java ~445毫秒

g++ ~370毫秒在-O3下

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


2
DMD的后端优化不如基于GCC的GDC或基于LLVM的LDC。如果使用GDC构建,您的测试程序在我的计算机上运行速度略快于Java。如果性能对您的项目很重要,请勿在发布版本中使用DMD。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接