Have you read this recent thread and its examples?
https://groups.google.com/d/msg/julia-dev/JEiH96ofclY/_amm9Cah6YAJ

M

On Thu, 2015-01-15 at 20:50, Petr Krysl <[email protected]> wrote:
> So the "call" syntax on a type works, but using the implementation 
> referenced above, it is SLOW.
>
> # Slow, function callback 
> function test1(f, n)
> summ=0
>     for i=1:n
>         summ=summ+f(i)
>     end
> return summ
> end
>
> g(i::Int)=i
>
> # Fast, hardwired function g()
> function test2(n)
> summ=0
>     for i=1:n
>         summ=summ+g(i)
>     end
> return summ
> end
>
> # Fast, using method defined for an object
> function test4{T}(o::T, n)
> summ=0
>     for i=1:n
>         summ=summ+get(o,i)
>     end
> return summ
> end
>
> type MyFun1
> end
> function get(o::MyFun1,i::Int)
>     return g(i)
> end
>
> # Slow, using "call" on a singleton
> type MyFun3 end
> call(::Type{MyFun3},i::Int)=g(i)::Int
>
> n=10002345;
> @time println("test1(g, n) = $( test1(g, n) )")
> @time println("test2(n) = $( test2(n) )") 
> @time println("test4(MyFun1(), n) = $( test4(MyFun1(), n) )")  
> @time println("test1(MyFun3, n) = $( test1(MyFun3, n) )") 
>
> julia> include("fun.jl")
> test1(g, n) = 50023457750685
> elapsed time: 0.610016329 seconds (480173520 bytes allocated, 27.80% gc 
> time)
> test2(n) = 50023457750685
> elapsed time: 0.003086749 seconds (75304 bytes allocated)
> test4(MyFun1(), n) = 50023457750685
> elapsed time: 0.004098207 seconds (90436 bytes allocated)
> test1(MyFun3, n) = 50023457750685
> elapsed time: 0.665630908 seconds (480184232 bytes allocated, 23.21% gc 
> time)

Reply via email to