On Monday, 5 March 2018 at 06:01:27 UTC, J-S Caux wrote:
On Monday, 5 March 2018 at 05:40:09 UTC, rikki cattermole wrote:
On 05/03/2018 6:35 PM, J-S Caux wrote:
I'm considering shifting a large existing C++ codebase into D (it's a scientific code making much use of functions like atan, log etc).

I've compared the raw speed of atan between C++ (Apple LLVM version 7.3.0 (clang-703.0.29)) and D (dmd v2.079.0, also ldc2 1.7.0) by doing long loops of such functions.

I can't get the D to run faster than about half the speed of C++.

Are there benchmarks for such scientific functions published somewhere

Gonna need to disassemble and compare them.

atan should work out to only be a few instructions (inline assembly) from what I've looked at in the source.

Also you should post the code you used for each.

So the codes are trivial, simply some check of raw speed:

  double x = 0.0;
for (int a = 0; a < 1000000000; ++a) x += atan(1.0/(1.0 + sqrt(1.0 + a)));

for C++ and

  double x = 0.0;
for (int a = 0; a < 1_000_000_000; ++a) x += atan(1.0/(1.0 + sqrt(1.0 + a)));

for D. C++ exec takes 40 seconds, D exec takes 68 seconds.

Depending on your platform, the size of `double` could be different between C++ and D. Could you check that the size and precision are indeed the same? Also, benchmark method is just as important as benchmark code. Did you use DMD or LDC as the D compiler? In this case it shouldn't matter, but try with LDC if you haven't. Also ensure that you've used the right flags:
`-release -inline -O`.

If the D version is still slower, you could try using the C version of the function Simply change `import std.math: atan;` to `core.stdc.math: atan;` [0]

[0]: https://dlang.org/phobos/core_stdc_math.html#.atan

Reply via email to