Using Steven's modifications gets this down to 0.068 seconds for me vs. 0.061 seconds for C – unfairly including startup time for C because I don't feel like instrumenting C code with timing stuff, but there's very little startup overhead for C executables, so it's close.
On Thu, Feb 13, 2014 at 10:54 AM, James King <[email protected]> wrote: > OK, using the Bool fix for the floats in the sieve, I get > > julia> @time myprimes(10000000) > elapsed time: 0.12674999237060547 seconds > > This seems like a good number, very close to the C time. > > I had originally written this with trues(N) but this creates a bitarray, > and the overhead slowed the program down. > > On Thursday, February 13, 2014 10:40:50 AM UTC-5, Steven G. Johnson wrote: >> >> For me it takes 0.27 seconds (which can be reduced to 0.09sec by >> optimization, see below), so you are doing something wrong if you are >> getting 10x slower numbers. >> >> My guess is that you are including the Julia startup time in the >> timings. Instead, do: >> >> @time println(primes(10000000)) >> @time println(primes(10000000)) >> >> in your code, to time just the execution of primes(10000000) and print >> the results, running the benchmark twice because the first time you run >> something in Julia it is a bit slower due to compilation time. (The same >> is true in PyPy.) >> >> PS. It is a bit better to use >> sieveTo = isqrt(N) >> so that sieveTo is an integer, as "ceil" returns a floating-point value >> (which makes i and j floating-point as well). Or you could use >> int(ceil(sqrt(N)), but isqrt is a bit more careful about roundoff errors. >> Also, your S array is a floating-point array, whereas you only need an >> array of bits. Use >> S = ones(Bool, N) >> instead. This brings the time down to 0.09 seconds for me, comparable >> to your C numbers. >> >
