Speed of math function atan: comparison D and C++

Uknown sireeshkodali1 at gmail.com
Mon Mar 5 09:48:49 UTC 2018


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


More information about the Digitalmars-d-learn mailing list