我想知道为什么D代码这么慢?我最初使用std.algorithm.sum,但性能更差。
我的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;
}
内置:
clang -O3 -o csum arraysum.c
答案 0 :(得分:7)
您可以使用uninitializedArray
中的std.array
来提高速度,并直接在数组上使用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版本的速度相同
答案 1 :(得分:2)
尝试使用gcc或ldc构建它。 dmd编译器是其他编译器应该使用的语言参考,但它不会产生特别快的二进制文件。 gcc要好得多。