Maybe this is just obvious, but it's not making much sense to me.

If I have a reference to a function (pardon if that's not the correct 
Julia-ish terminology - basically just a variable that holds a Function 
type) and call it, it runs much more slowly (persumably because it's 
allocating a lot more memory) than it would if I make the same call with  
the function directly.

Maybe that's not so clear, so let me show an example using the abs function:

    function test_time()
         sum = 1.0
         for i in 1:1000000
           sum += abs(sum)
         end
         sum
     end

Run it a few times with @time:

   julia> @time test_time()
    elapsed time: 0.007576883 seconds (96 bytes allocated)
    Inf

   julia> @time test_time()
    elapsed time: 0.002058207 seconds (96 bytes allocated)
    Inf

    julia> @time test_time()
    elapsed time: 0.005015882 seconds (96 bytes allocated)
    Inf

Now let's try a modified version that takes a Function on the input:

    function test_time(func::Function)
         sum = 1.0
         for i in 1:1000000
           sum += func(sum)
         end
         sum
     end

So essentially the same function, but this time the function is passed in. 
Running this version a few times:

    julia> @time test_time(abs)
    elapsed time: 0.066612994 seconds (32000080 bytes allocated, 31.05% 
gc     time)
    Inf
 
    julia> @time test_time(abs)
    elapsed time: 0.064705561 seconds (32000080 bytes allocated, 31.16% gc 
time)
    Inf

So roughly 10X slower, probably because of the much larger amount of memory 
allocated (32000080 bytes vs. 96 bytes)

Why does the second version allocate so much more memory? (I'm running 
Julia 0.3.6 for this testcase)

Phil


Reply via email to