On 11/12/15 13:22, Daniel Kozak via Digitalmars-d wrote: >>> timings: >>> > > >>> > > DMD (-O -release -inline -boundscheck=off): >>> > > real 0m0.003s >>> > > user 0m0.000s >>> > > sys 0m0.000s >>> > > >>> > > LDMD2-ldc2 (-O -release -inline -boundscheck=off): >>> > > real 0m1.071s >>> > > user 0m1.067s >>> > > sys 0m0.000s >>> > > >>> > > >>> > > GDC (-O3 -finline -frelease -fno-bounds-check): >>> > > real 0m0.724s >>> > > user 0m0.720s >>> > > sys 0m0.003s >> > >> > What versions of these compilers? I suspect the majority (maybe >> > 80%-ish) of the time is spent allocating memory, so you might be >> > seeing GC improvements in recent DMD > DMD 2.069 > > LDC 2.067 > > GDC 2.065 > > No it is not cause by memory allocations. > > It seems DMD can recognize that fmttable has same result every time, so > it does compute it only once.
Comparisons using different frontend versions are very unfair - - *every D release introduces a new language dialect* (for example: http://dlang.org/changelog/2.068.0.html#attribinference3). Out of curiosity, how does this slightly more sane version perform? (I don't have any dmd or ldc compilers; it takes ~80ms using GDC) import std.stdio; auto fmttable(alias sink=sink)(immutable(string[][]) table) { import std.range : take, repeat; if (table.length == 0) return; // column widths auto widths = new int[](table[0].length); foreach (rownum, row; table) { foreach (colnum, cell; row) { if (cell.length > widths[colnum]) widths[colnum] = cast(int)cell.length; } } foreach (row; table) { sink("|"); foreach (colnum, cell; row) { sink(cell, ' '.repeat().take(widths[colnum]-cast(int)cell.length), "|"); } sink("\n"); } } void sink(S...)(S s) { foreach(I, _; S) write(s[I]); } void sink0(S...)(S s) {} void main() { immutable table = [ ["row1.1", "row1.2 ", "row1.3"], ["row2.1", "row2.2", "row2.3"], ["row3.1", "row3.2", "row3.3 "], ["row4.1", "row4.2", "row4.3"], ["row5.1", "row5.2", "row5.3"], ]; fmttable(table); int i; for (i=0; i < 1000000; ++i) { fmttable!sink0(table); } sink(i, "\n"); } artur