D slower ~1s from C ?!
Kapps
opantm2+spam at gmail.com
Thu Apr 5 16:23:52 PDT 2012
On Thursday, 5 April 2012 at 17:22:38 UTC, Minas wrote:
> Many of you should know the website "projecteuler.net", where
> there are mathematical problems to solve with computers.
>
> I am doing those in D, and after I finished one today, I
> decided to compile it in C as well to compare the results.
>
> The problem was:
>
> "The number 3797 has an interesting property. Being prime
> itself, it is possible to continuously remove digits from left
> to right, and remain prime at each stage: 3797, 797, 97, and 7.
> Similarly we can work from right to left: 3797, 379, 37, and 3.
>
> Find the sum of the only eleven primes that are both
> truncatable from left to right and right to left.
>
> NOTE: 2, 3, 5, and 7 are not considered to be truncatable
> primes."
>
> My solution in D:
>
First, you should compile with -O -release -inline and, in this
case, -noboundscheck.
The main issue here seems to be the for loop.
Changing:
for(ulong i = 2; i <= cast (ulong)sqrt(cast(double)n+1); ++i)
if( n % i == 0 )
return false;
To:
ulong End = cast (ulong)sqrt(cast(double)n+1);
for(ulong i = 2; i <= End; ++i)
if( n % i == 0 )
return false;
Results in a 26 times performance increase for me, based off of
using a StopWatch at start of main and stopping it at end of
main. It's possible that the C compiler can recognize that this
is a constant expression (sqrt might be an intrinsic). D should
be able to do this even better; sqrt is strongly pure and takes
in arguments that do not change, thus it should be able to
automatically make the change I did above. It (at least DMD) does
not seem to however.
I did not try the C version, and the D version was compiled with
DMD on Windows.
More information about the Digitalmars-d-learn
mailing list