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

Reply via email to