> I wonder if using plain `Array` instead may be result in better performance > where immutability is not needed.
Hmm, no: module appendertest; import std.array; import std.datetime; import std.stdio; import std.container; enum size = 1_000; void test1() { auto arr = appender!(int[])(); foreach(n; 0 .. size) arr.put(n); } void test1prime() { auto arr = appender!(int[])(); foreach(n; 0 .. size) arr ~= n; } void test2() { int[] arr; foreach(n; 0 .. size) arr ~= n; } void test2prime() { int[] arr; arr.reserve(size); foreach(n; 0 .. size) arr ~= n; } void test3() { Array!int arr; foreach(n; 0 .. size) arr ~= n; } void test3prime() { Array!int arr; arr.reserve(size); foreach(n; 0 .. size) arr ~= n; } void test4() { auto arr = new int[](size); foreach(n; 0 .. size) arr[n] = n; } void test5() { auto arr = uninitializedArray!(int[])(size); foreach(n; 0 .. size) arr[n] = n; } void main() { auto result = benchmark!(test1, test1prime, test2, test2prime, test3, test3prime, test4, test5 )(10_000); writeln("Appender.put :", cast(Duration)result[0]); writeln("Appender ~= :", cast(Duration)result[1]); writeln("Std array :", cast(Duration)result[2]); writeln("Std array.reserve :", cast(Duration)result[3]); writeln("Array :", cast(Duration)result[4]); writeln("Array.reserve :", cast(Duration)result[5]); writeln("new T[]() :", cast(Duration)result[6]); writeln("uninitializedArray :", cast(Duration)result[7]); } Times: Appender.put :157 ms, 602 μs, and 3 hnsecs Appender ~= :182 ms, 807 μs, and 1 hnsec Std array :256 ms, 210 μs, and 7 hnsecs Std array.reserve :244 ms, 770 μs, and 4 hnsecs Array :336 ms, 207 μs, and 3 hnsecs Array.reserve :321 ms, 500 μs, and 6 hnsecs new T[]() :28 ms, 496 μs, and 6 hnsecs uninitializedArray :26 ms and 620 μs