Few dynamic array benchmarks that can show you more differences between C++ and D2.
Timings dmd, N=5_000_000, NLOOPS=15, T=double, seconds: C++ v1: 0.67 C++ v1: 0.72 D v1: 6.47 (uses >1 GB RAM) D v2: 0.76 D v3: 5.25 dmd v2.043, dmd -O -release -inline g++ 4.4.1, -O3 -Wall -s ----------------- // D v.1 import std.c.stdio: printf; void main() { alias double T; enum int N = 5_000_000; enum int NLOOPS = 15; T[] arr; arr.length = N; foreach (i; 0 .. NLOOPS) { arr.length = 0; foreach (j; 0 .. N) arr ~= j; printf("At iteration %d, arr has %u elements.\n", i, arr.length); } } ----------------- // D v.2 import std.c.stdio: printf; void main() { alias double T; enum int N = 5_000_000; enum int NLOOPS = 15; auto arr = new T[N]; foreach (i; 0 .. NLOOPS) { uint arr_len = 0; foreach (j; 0 .. N) { arr[arr_len] = j; arr_len++; } printf("At iteration %d, arr has %u elements.\n", i, arr_len); } } ----------------- // D v.3 import std.c.stdio: printf; void main() { alias double T; enum int N = 5_000_000; enum int NLOOPS = 15; T[] arr; arr.reserve(N); foreach (i; 0 .. NLOOPS) { arr.length = 0; arr.assumeSafeAppend; foreach (j; 0 .. N) arr ~= j; printf("At iteration %d, arr has %u elements.\n", i, arr.length); } } ----------------- // C++ v.1 #include "stdio.h" #include <vector> int main() { typedef double T; const int N = 5000000; const int NLOOPS = 15; std::vector<T> arr; arr.reserve(N); for (int i = 0; i < NLOOPS; i++) { arr.clear(); for (int j = 0; j < N; j++) arr.push_back(j); printf("At iteration %d, arr has %u elements.\n", i, arr.size()); } } ----------------- // C++ v.2 #include "stdio.h" #include <vector> int main() { typedef double T; const int N = 5000000; const int NLOOPS = 15; std::vector<T> arr(N); for (int i = 0; i < NLOOPS; i++) { size_t arr_len = 0; for (int j = 0; j < N; j++) { arr[arr_len] = j; arr_len++; } printf("At iteration %d, arr has %u elements.\n", i, arr_len); } } ----------------- Bye, bearophile