DMD is faster than LDC and GDC
Artur Skawina via Digitalmars-d
digitalmars-d at puremagic.com
Thu Nov 12 10:36:51 PST 2015
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
More information about the Digitalmars-d
mailing list