Array append performance

bearophile bearophileHUGS at lycos.com
Mon Aug 25 05:54:10 PDT 2008


Lionello Lunesu:
>However, if you were to append to two different arrays in a similar loop, the performance would be terrible, since each array would overwrite the cache with its own ptr/size, resulting in the slow O(m+n) for each capacity look-up.<

Yes, there's something that deserves some improvements, probably at various levels. I have modified the benchmarks in the way you have explained (see below), with n = 4 millions the running time of the C++ version is barely testable (0.04 s), the D version takes 32.2 s (I have had not enough patience to see it finish with n = 10 millions).

Bye,
bearophile

------------------
C++:

#include "stdio.h"
#include <vector>

using namespace std;

int main(int argc, char **argv) {
    int n = argc >= 2 ? atoi(argv[1]) : 1000;

    vector<int> a1;
    a1.reserve(n);
    vector<int> a2;
    a2.reserve(n);
    for (int i = 0; i < n; ++i) {
        a1.push_back(i);
        a2.push_back(i);
    }

    printf("%d %d\n", a1[n - 1], a2[n - 1]);
    return 0;
}

------------------
C++:

import std.conv: toInt;
import std.gc: malloc, hasNoPointers;

int main(string[] args) {
    int n = args.length >= 2 ? toInt(args[1]) : 1000;

    int* aux_ptr1 = cast(int*)malloc(n * int.sizeof);
    hasNoPointers(aux_ptr1);
    int[] a1 = aux_ptr1[0 .. 0];

    int* aux_ptr2 = cast(int*)malloc(n * int.sizeof);
    hasNoPointers(aux_ptr2);
    int[] a2 = aux_ptr2[0 .. 0];

    for (int i; i < n; i++) {
        a1 ~= i;
        a2 ~= i;
    }

    printf("%d %d\n", a1[n - 1], a2[n - 1]);
    return 0;
}



More information about the Digitalmars-d mailing list