SECOND EDIT: Этот запрос на перенос в github устранит проблему. Пока работает Julia v0.5 +, анонимные функции будут такими же быстрыми, как и обычные функции. Итак, закрытый случай.
EDIT: Я обновил определения вопросов и функций до более общего случая.
Для простого примера компилятор Julia, похоже, не оптимизируется, когда функция передается функции или функция определена внутри функции. Это меня удивляет, так как это очень часто встречается в пакетах оптимизации. Правильно ли я делаю что-то глупое? Ниже приведен простой пример:
f(a::Int, b::Int) = a - b #A simple function
function g1(N::Int, fIn::Function) #Case 1: Passing in a function
z = 0
for n = 1:N
z += fIn(n, n)
end
end
function g2(N::Int) #Case 2: Function defined within a function
fAnon = f
z = 0
for n = 1:N
z += fAnon(n, n)
end
return(z)
end
function g3(N::Int) #Case 3: Function not defined within function
z = 0
for n = 1:N
z += f(n, n)
end
return(z)
end
Затем я запускаю следующий код ко времени трех случаев:
#Run the functions once
g1(10, f)
g2(10)
g3(10)
@time g1(100000000, f)
@time g2(100000000)
@time g3(100000000)
И тайминги:
elapsed time: 5.285407555 seconds (3199984880 bytes allocated, 33.95% gc time)
elapsed time: 5.424531599 seconds (3199983728 bytes allocated, 32.59% gc time)
elapsed time: 2.473e-6 seconds (80 bytes allocated)
Распределение памяти и сбор мусора для первых двух случаев. Может ли кто-нибудь объяснить, почему?