Have a look at
https://groups.google.com/d/msg/julia-dev/JEiH96ofclY/_amm9Cah6YAJ there
are some hack-y solutions mentioned there.  If I recall correctly, using
a constructor instead of a function can solve the problem.

On Tue, 2015-01-20 at 22:16, Keith Mason <keith.ma...@conning.com> wrote:
> I am trying to make use of functions as data, where I store functions in an 
> array and call them in a loop. All of my functions return Float64, but 
> because I am assigning the function to a variable before calling it, Julia 
> can't figure that out.
>
> Here's some example code:
>
> foo() = 0.0
> goo(x::Float64) = x
>
> So if I am to call goo(foo()), this is quite type stable and results in 
> virtually no code. If I call it in a loop 100,000,000 times, it takes about 
> a millisecond.
>
> However, if I do this:
>
> function test1()
>   for i=1:100000000
>     f = foo
>     r = f()
>     goo(r)
>   end
> end
>
> Now I'm in trouble. Even though Julia knows that foo returns a float, it 
> doesn't know that f returns a float. This code in a loop of 100,000,000 
> takes nearly 8 seconds and allocates 32GB of RAM. (Honestly, this strikes 
> me as an optimization that just doesn't yet exist, but my use case is a 
> little more complicated; in my case, f can be one of multiple functions, 
> selected by a parameter. But let's set that aside for the purposes of this 
> question.)
>
> Declaring the type of the variable doesn't help; in fact, it makes it worse:
>
> function test2()
>   for i=1:100000000
>     f = foo
>     r::Float64 = f()
>     goo(r)
>   end
> end
>
> But I can improve the situation a bit by casting the result of the function.
>
> function test3()
>   for i=1:100000000
>     f = foo
>     r = f()::Float64
>     goo(r)
>   end
> end
>
> This cuts run time and memory allocation in half. But it is still taking 
> too long because it has to check if f returns a float before assigning it 
> to t. @code_lowered shows that a call to typeassert is the culprit here. Is 
> there any way I can promise Julia that f returns float so it doesn't have 
> to call typeassert? I tried
>
> f::Function{Float64} = foo
>
> and
>
> f::Function::Float64
>
> but I can't find any syntax that works. I know there is a macro @inbounds 
> <https://github.com/inbounds> to turn off bounds checking; is there 
> something similar that turns off type checking?

Reply via email to