为什么我的 D 代码对一个向量求和比 C 慢 4?
Why is my D code to sum a vector up x4 slower than C?
我想知道为什么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
尝试使用 gcc 或 ldc 构建它。
dmd 编译器是其他编译器应该使用的语言参考,但它不会生成特别快的二进制文件。
gcc 好多了。
您可以从 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 版本速度相同
我想知道为什么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
尝试使用 gcc 或 ldc 构建它。 dmd 编译器是其他编译器应该使用的语言参考,但它不会生成特别快的二进制文件。 gcc 好多了。
您可以从 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 版本速度相同