faulty benchmark

-do not benchmark "format"

-use a dummy-var - just add(overflow is not a problem) your plus() results to it and return that in your main - preventing dead code optimization in any way

-introduce some sort of random-value into your plus() code, for example
use an random-generator or the int-casted pointer to program args as startup value

-do not benchmark anything without millions of loops - use the average as the result

anything else does not makes sense

Am 30.05.2014 15:35, schrieb Thomas:
I made the following performance test, which adds 10^9 Double’s
on Linux with the latest dmd compiler in the Eclipse IDE and with
the Gdc-Compiler also on Linux. Then the same test was done with
C++ on Linux and with Scala in the Java ecosystem on Linux. All
the testing was done on the same PC.
The results for one addition are:

D-DMD: 3.1 nanoseconds
D-GDC: 3.8 nanoseconds
C++: 1.0 nanoseconds
Scala: 1.0 nanoseconds


D-Source:

import std.stdio;
import std.datetime;
import std.string;
import core.time;


void main() {
    run!(plus)( 1000*1000*1000 );
}

class C {
}

string plus( int steps  )  {
    double sum = 1.346346;
    immutable double p0 = 0.0045;
    immutable double p1 = 1.00045452-p0;
    auto b = true;
    for( int i=0; i<steps; i++){
        switch( b ){
        case true :
          sum += p0;
          break;
        default:
          sum += p1;
          break;
        }
        b = !b; 
    }
    return (format("%s  %f","plus\nLast: ", sum) );
//  return ("plus\nLast: ", sum );
}


void run( alias func )( int steps )
    if( is(typeof(func(steps)) == string)) {
    auto begin = Clock.currStdTime();
    string output = func( steps );
    auto end =  Clock.currStdTime();
    double nanotime = toNanos(end-begin)/steps;
    writeln( output );
    writeln( "Time per op: " , nanotime );
    writeln( );
}

double toNanos( long hns ) { return hns*100.0; }


Compiler settings for D:

dmd -c
-of.dub/build/application-release-nobounds-linux.posix-x86-dmd-DF74188E055ED2E8ADD9C152107A632F/first.o
-release -inline -noboundscheck -O -w -version=Have_first
-Isource source/perf/testperf.d

gdc ./source/perf/testperf.d -frelease -o testperf

So what is the problem ? Are the compiler switches wrong ? Or is
D on the used compilers so slow ? Can you help me.


Thomas



Reply via email to