You are making the assumption that `sin(.34567)` is a constant, but in 
Julia technically sin is dependent on global state, specifically the 
rounding and denormalisation modes 
http://docs.julialang.org/en/release-0.4/stdlib/numbers/?highlight=rounding#Base.set_rounding.
 
 It these change during the loop, then the answer may not be the same, and 
like all global state Julia can't infer that.  Whereas you have 
demonstrated that you can tell Julia its a constant with the same value as 
calculated at initialisation.

On Monday, December 7, 2015 at 7:59:08 PM UTC+10, Meik Hellmund wrote:
>
>
> Thank you for pointing out the problem with a global y and its type. 
> I hope my new code example below is better. I want to point at 
> the relative performance difference of the functions f and g.  
>
> I am experimenting with Julia for  a couple of weeks and I like it very 
> much. 
> In my experience, every language has a different  borderline between 
> "The programmer should think about optimal performance" and 
> "Don't overoptimize, the compiler is smarter than you". 
>
> So I just want to understand if Julia does 
> constant expression evaluation at compile time or not
>
> I think julia 0.4.1 does not. My code:
> #-------------------------------------
> function stupidtest(f)
>     for x in 1 : 10^8
>        f(x)
>     end
> end
>
> f(x) =  x + log(2.) * sin(.34567)^2
>
> const z = log(2.) * sin(.34567)^2
> g(x) = x + z
>
> @time( stupidtest(f) )
> @time( stupidtest(g) )
> #------- EOF------------------------------
>
> $julia --optimize --inline=yes --check-bounds=no --math-mode=fast 
> mycode.jl 
>   2.869774 seconds (200.00 M allocations: 2.980 GB, 3.39% gc time)
>   1.855530 seconds (200.00 M allocations: 2.980 GB, 4.32% gc time)
>
>
> It also seems that I (with a C++/Fortran background) do not really 
> understand 
> some aspects of the language. Why does a loop with a function call
> need so much memory allocations?
>
> Any explanations are appreciated!
>  
> Cheers, Meik
>
>
>

Reply via email to