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