为什么我的 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 版本速度相同