math.log() benchmark of first 1 billion int using std.parallelism
Iov Gherman via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Dec 22 02:12:50 PST 2014
Hi everybody,
I am a java developer and used C/C++ only for some home projects
so I never mastered native programming.
I am currently learning D and I find it fascinating. I was
reading the documentation about std.parallelism and I wanted to
experiment a bit with the example "Find the logarithm of every
number from 1 to 10_000_000 in parallel".
So, first, I changed the limit to 1 billion and ran it. I was
blown away by the performance, the program ran in: 4 secs, 670 ms
and I used a workUnitSize of 200. I have an i7 4th generation
processor with 8 cores.
Then I was curios to try the same test in Java just to see how
much slower will that be (at least that was what I expected). I
used Java's ExecutorService with a pool of 8 cores and created
5_000_000 tasks, each task was calculating log() for 200 numbers.
The whole program ran in 3 secs, 315 ms.
Now, can anyone explain why this program ran faster in Java? I
ran both programs multiple times and the results were always
close to this execution times.
Can the implementation of log() function be the reason for a
slower execution time in D?
I then decided to ran the same program in a single thread, a
simple foreach/for loop. I tried it in C and Go also. This are
the results:
- D: 24 secs, 32 ms.
- Java: 20 secs, 881 ms.
- C: 21 secs
- Go: 37 secs
I run Arch Linux on my PC. I compiled D programs using dmd-2.066
and used no compile arguments (dmd prog.d).
I used Oracle's Java 8 (tried 7 and 6, seems like with Java 6 the
performance is a bit better then 7 and 8).
To compile the C program I used: gcc 4.9.2
For Go program I used go 1.4
I really really like the built in support in D for parallel
processing and how easy is to schedule tasks taking advantage of
workUnitSize.
Thanks,
Iov
More information about the Digitalmars-d-learn
mailing list