Woeful performance of D compared to C++

Dave Dave_member at pathlink.com
Thu Jan 18 12:47:23 PST 2007


D's rand() is slow.

//import std.random;
extern (C) int rand();
import std.stdio;
import std.conv;

void main()
{
     const uint n = 10_000_000;
     ubyte doors;
     uint wins, wins_switching;

     for (uint i; i < n; ++i) {
         doors |= cast(ubyte)(1 << rand() % 3);

         if (doors & 1) {
             ++wins;
         } else {
             ++wins_switching;
         }

         doors = 0;
     }

     writefln("Wins switching: %d [%f%%]", wins_switching,
              (wins_switching / cast(double) n) * 100);
     writefln("Wins without switching: %d [%f%%]", wins,
              (wins / cast(double) n) * 100);
}

rael at seesig.com wrote:
> In other benchmarks I've seen, D seems quite competitive with C/C++.
> 
> I seem to have written a very simple program that shows D in a very
> poor light compared to C++.  I wonder if it is my inexperience.
> 
> I am using dmd 1.0, and g++ 4.1.1 under Linux Fedora Core 6, running
> on a 3.0 GHz Pentium 4 with 1 gig of RAM.
> 
> The program is a simulation of the Monty Hall problem (see Wikipedia).
> 
> Here is the D program:
> 
> import std.random;
> import std.stdio;
> 
> void main() {
>     const uint n = 10_000_000;
>     ubyte doors;
>     uint wins, wins_switching;
> 
>     for (uint i; i < n; ++i) {
>         doors |= cast(ubyte)(1 << rand() % 3);
> 
>         if (doors & 1) {
>             ++wins;
>         } else {
>             ++wins_switching;
>         }
> 
>         doors = 0;
>     }
> 
>     writefln("Wins switching: %d [%f%%]", wins_switching,
>              (wins_switching / cast(double) n) * 100);
>     writefln("Wins without switching: %d [%f%%]", wins,
>              (wins / cast(double) n) * 100);
> }
> 
> Compiled with:
> 
> % dmd -I/opt/dmd/src/phobos -O -inline monty.d -ofmonty_d
> gcc monty.o -o monty_d -m32 -lphobos -lpthread -lm 
> 
> and here is the C++:
> 
> #include <iostream>
> #include <cstdlib>
> 
> int main() {
>     unsigned char doors = 0;
>     const unsigned int n = 10000000;
>     unsigned int wins = 0, wins_switching = 0;
> 
>     for (unsigned int i = 0; i < n; ++i) {
>         unsigned char r = 1 << (rand() % 3);
>         doors |= r; // place the car behind a random door
> 
>         if (doors & 1) { // choose zero'th door, same as random choice
>             ++wins;
>         } else {
>             ++wins_switching;
>         }
> 
>         doors ^= r; // zero the door with car
>     }
> 
>     const double d = n / 100;
>     std::cout << "Win % switching: " << (wins_switching / d)
>               << "\nWin % no switching: " << (wins / d) << '\n';
> }
> 
> Compiled with:
> 
> % g++ -O3 -o monty_cc
> 
> Execution times (best of 5):
> 
> % time monty_d
> Wins switching: 6665726 [66.657260%]
> Wins without switching: 3334274 [33.342740%]
> 
> real    0m2.444s
> user    0m2.442s
> sys     0m0.002s
> 
> % time monty_cc
> Win % switching: 66.6766
> Win % no switching: 33.3234
> 
> real    0m0.433s
> user    0m0.432s
> sys     0m0.001s
> 
> 
> Any help would be appreciated.
> 
> Thanks.
> 
> 
> Bill
> --
> Bill Lear
> r * e * @ * o * y * a * c * m
> * a * l * z * p * r * . * o *
> 



More information about the Digitalmars-d mailing list