2015-02-24 46 views
3

我想知道爲什麼D代碼太慢?我最初使用std.algorithm.sum,但性能更差。爲什麼我的D代碼將一個矢量加起來比C慢?

我d代碼:

import std.algorithm; 
import std.stdio; 

void main() 
{ 
    immutable int n = 10000000; 
    int[] v = new int[n]; 
    fill(v,1); 
    int total = 0; 

    foreach (int i; 0 .. n) { 
     total += v[i]; 
    } 

    writeln(total); 
} 

使用內置:

dmd -O arraysum.d 

等效的C代碼:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    const int n = 10000000; 
    int *v = malloc(n * sizeof(int)); 

    for (int i = 0; i < n; ++i) { 
      v[i] = 1; 
    } 

    int total = 0; 
    for (int i = 0; i < n; ++i) { 
      total += v[i]; 
    } 

    printf("%d\n", total); 
    free(v); 
    return 0; 
} 

內置有:

​​
+1

並且您是否嘗試過'foreach(int el; v){total + = el;}',您是否也查看過編譯後的輸出? C++完全有可能將循環優化爲「total = 10000000;' – 2015-02-24 10:42:06

回答

7

您可以從std.array改善uninitializedArray速度和直接使用的foreach在陣:

import std.algorithm; 
import std.stdio; 
import std.array; 

void main() 
{ 
    immutable int n = 10000000; 
    auto v = uninitializedArray!(int[])(n); 
    fill(v, 1); 
    int total = 0; 

    foreach (i; v) { 
      total += i; 
    } 

    writeln(total); 
} 

,你應該使用-release -inline -noboundscheck參數

對我來說,與DMD是它的2倍速度較慢,但​​與ldmd2(LDC)或gdc的速度與C版本相同

+0

哇,這對我的C示例來說工作起來並且速度相同!我期待着調查更多的D代碼。我的代碼很慢,因爲它是用'0'隱式地初始化它的。 – jimjampez 2015-02-24 12:58:09

+0

@jimjampez並且可能是循環中的過度邊界檢查 – 2015-02-25 11:13:27

2

嘗試使用gcc或ldc構建它。 dmd編譯器是其他編譯器應該使用的語言參考,但它不會產生特別快的二進制文件。 gcc好多了。

相關問題