Hi there,

That's quite strange.  The type of a is being inferred correctly as
Array{Float64,2} in both cases, but there's definitely a slowdown.  I
wonder if it's doing the conversion of 2 from Int to Float64 at runtime,
instead of at compile time.

Would you be willing to report this as a bug on github?

Cheers,
   Kevin

P.S. As an aside, in Julia, [.5 2] creates a 2D array, and [.5,2] creates a
1D vector.  In this case, it doesn't matter, but it might in some code.

On Sat, Jun 21, 2014 at 8:25 AM, a. kramer <[email protected]> wrote:

> I'm not an experienced programmer, but I was wondering if someone is
> interested in commenting on this performance difference that surprised me a
> little.  It's something I ran across while writing some simple simulations,
> and I have made the following minimal example.  If I define the following
> function in a file and include it execution takes about 0.9 s:
>
> function test()
>     a = [.5 2.]
>     N = 10000000
>     M = length(a)
>
>     sum = 0
>     tic()
>     for i=1:N
>         for j=1:M
>             sum = sum+a[j]
>         end
>     end
>     toc()
> end
>
> julia> test()
> elapsed time: 0.885158777 seconds
>
> If however, I change the second line to a = [.5 2] (no period after the
> second number, so that one number is clearly real while the other is an
> integer), it takes 40-50% longer:
>
> julia> test()
> elapsed time: 1.27722677 seconds
>
> Defining a as const did not change this result.  But if on the other
> hand, I pass in the array a as an argument to test, there is no
> difference between test([.5 2.]) and test([.5 2]).  And of course typing
>
> a = zeros(2)
> a[1] = .5
> a[2] = 2
>
> does not have the performance penalty, but is inconvenient for larger
> arrays.  I ran into this while writing a simulation in which I defined some
> parameters as arrays at the beginning of the simulation.  In that case the
> difference between the two cases (all values clearly reals as opposed to a
> mix of reals and integers) changed the execution time changed by a factor
> of 15-20.
>
> This was somewhat surprising as I had figured that the compiler would be
> able to infer that a is an array of floats in either case.  As a result
> I've taken to either passing in any parameters to the function or very
> carefully reading my code to ensure that I'm not mixing integers and floats
> in these kinds of definitions.  I don't know if this performance difference
> is avoidable or not, but as a naive user it did surprise me.
>

Reply via email to