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.
>>
>

Reply via email to