The `cfunction` here has the effect of manually hoisting the method
lookup in the call to `f`, so it is indeed necessary. The
StableFunction only has the effect of automatically changing f() to
f()::Float64 (which Keith already tried above), which is also useful
but not as fast.

On Tue, Jan 20, 2015 at 6:02 PM, Erik Schnetter <schnet...@gmail.com> wrote:
> I the `cfunction` necessary here? Since you already have the return type `R`, 
> wouldn't it suffice to annotate the call with a `::R` suffix? I am thinking:
>
> immutable StableFunction{R,A}
>     f
>     StableFunction(f) = new(f)
> end
>
> call{R,A}(f::StableFunction{R,A}, x) = f(x)::R
>
> -erik
>
>> On Jan 20, 2015, at 17:56 , Jeff Bezanson <jeff.bezan...@gmail.com> wrote:
>>
>> Oh, I should also mention that the version that calls goo(foo()) takes
>> so little time because the entire loop is probably optimized out.
>>
>> On Tue, Jan 20, 2015 at 5:54 PM, Jeff Bezanson <jeff.bezan...@gmail.com> 
>> wrote:
>>> Here is a hack that basically works by escaping through the C type system:
>>>
>>> ```
>>> immutable CFunction{R,A}
>>>    f
>>>    p::Ptr{Void}
>>>    CFunction(f) = new(f, cfunction(f, R, (A,)))
>>> end
>>>
>>> call{R,A}(f::CFunction{R,A}, x) = ccall(f.p, R, (A,), x)
>>>
>>> foo(x::Float64) = 0.0
>>> goo(x::Float64) = x
>>>
>>> function test1()
>>>    for i=1:100000000
>>>        f = foo
>>>        r = f(1.0)
>>>        goo(r)
>>>    end
>>> end
>>>
>>> function test2()
>>>    f = CFunction{Float64,Float64}(foo)
>>>    for i=1:100000000
>>>        r = f(1.0)
>>>        goo(r)
>>>    end
>>> end
>>> ```
>>>
>>> I added an argument to `foo` to increase the generality somewhat.
>>> test1() is the original test case. test2() is the new version. The
>>> CFunction object needs to be constructed outside the loop, but this
>>> can be stored in a data structure and reused anywhere.
>>>
>>> -Jeff
>>>
>>>
>>> On Tue, Jan 20, 2015 at 4:34 PM, Ivar Nesje <iva...@gmail.com> wrote:
>>>> Originally posted at https://github.com/JuliaLang/julia/issues/9863
>
> --
> Erik Schnetter <schnet...@gmail.com>
> http://www.perimeterinstitute.ca/personal/eschnetter/
>
> My email is as private as my paper mail. I therefore support encrypting
> and signing email messages. Get my PGP key from https://sks-keyservers.net.
>

Reply via email to