为什么我的D代码总和一个比C慢x4的向量?

时间:2015-02-24 10:36:11

标签: d

我想知道为什么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

2 个答案:

答案 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要好得多。