3

私はDが初めてで、単純なテストでJavaと比較しており、ネイティブ言語の方が高速である(またはほぼ同じ)ことを期待しています。しかし、再帰Dを使用した最初のテストでは、Javaよりも驚くほど遅いです(ほぼ2倍)。

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。

私は何を間違っていますか?ありがとう!

4

4 に答える 4

9

Java は、JIT コンパイラーを介してネイティブでもあります。(強制インタープリター)を使用して JIT を無効にする-Xintと、D が大幅に高速であることがわかります。参考までに、C で同様の実装を試してみたところ、D と同じ速度になりました。

この種のマイクロ ベンチマークは、一般的なパフォーマンスのテストには役立ちません。ここで行っているのは、Java JIT でコンパイルされたコードと D でコンパイルされたコードをテストすることだけです。どちらもコンパイル中です。また、これは典型的な Java コードではありません。典型的な Java プログラムはヒープに多くのメモリを割り当てますが、典型的な D プログラムは割り当てません。

D と Java の実際のパフォーマンスについて知りたい場合は、実際のプログラムでテストする必要があります。

于 2013-01-12T23:43:37.297 に答える
8

DMD は D のリファレンス コンパイラですが、Cyber​​Shadow が前述したように、そのバックエンドは他のコンパイラである GDC や LDC ほど速くコードを生成しません。

私のコンピュータで測定されたタイミング:

D コンパイラ、すべて次のフラグまたは同等のフラグを使用: -noboundscheck -inline -O -release

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

Java ~445ms

-O3 で g++ ~370ms

これらの (マイクロ) 結果は、同じバックエンドを使用してコンパイルした場合、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 を処理するこれらの小さなアルゴリズムで、LuaJIT が非常に高速になることが期待されます。

于 2013-01-13T02:27:06.767 に答える