V Thu, 12 Nov 2015 12:10:30 +0000 John Colvin via Digitalmars-d <digitalmars-d@puremagic.com> napsáno:
> On Thursday, 12 November 2015 at 11:59:50 UTC, Daniel Kozak wrote: > > code: > > > > import std.stdio; > > > > auto fmttable(immutable(string[][]) table) { > > > > import std.array : appender, uninitializedArray; > > import std.range : take, repeat; > > import std.exception : assumeUnique; > > > > auto res = appender(uninitializedArray!(char[])(128)); > > res.clear(); > > > > 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) { > > res ~= "|"; > > foreach (colnum, cell; row) { > > int l = widths[colnum] - cast(int)cell.length; > > res ~= cell; > > if (l) > > res ~= ' '.repeat().take(l); > > res ~= "|"; > > } > > res.put("\n"); > > } > > > > return res.data.assumeUnique(); > > } > > > > 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"], > > ]; > > > > writeln(fmttable(table)); > > int i; > > for (i=0; i < 1000000; ++i) { > > fmttable(table); > > } > > writeln(i); > > } > > > > 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.