Вы неправильно оцениваете F
. Вот способ сделать это:
julia> @btime $F(1)
0.026 ns (0 allocations: 0 bytes)
2
Проблема не в том, что F
является глобальной непостоянной переменной, в то время как G
является константой, поэтому при доступе к F
ее значение не стабильный в @btime
.
Добавление $
перед вызовом делает F
локальной переменной во время теста, и вы можете видеть, что она одинаково быстра.
Также в таких случаях, вероятно, лучше сравнить некоторые более крупные функции. Вот краткий пример:
julia> function test(x)
s = 0
for i in 1:10^6
s += x(1)
end
s
end
test (generic function with 1 method)
julia> @btime test($F)
35.830 μs (0 allocations: 0 bytes)
2000000
julia> @btime test($G)
35.839 μs (0 allocations: 0 bytes)
2000000
Также вы можете проверить с помощью @code_native
, что F
и G
заканчиваются идентичным собственным кодом:
julia> @code_native F(1)
.text
; ┌ @ REPL[10]:2 within `foo'
cmpb $0, (%rsi)
je L17
; │ @ REPL[10]:3 within `foo'
; │┌ @ int.jl:53 within `+'
addq $1, %rdx
; │└
movq %rdx, (%rdi)
movb $2, %dl
xorl %eax, %eax
retq
L17:
movb $1, %dl
xorl %eax, %eax
; │ @ REPL[10]:3 within `foo'
retq
nopw %cs:(%rax,%rax)
; └
julia> @code_native G(1)
.text
; ┌ @ REPL[10]:2 within `foo'
cmpb $0, (%rsi)
je L17
; │ @ REPL[10]:3 within `foo'
; │┌ @ int.jl:53 within `+'
addq $1, %rdx
; │└
movq %rdx, (%rdi)
movb $2, %dl
xorl %eax, %eax
retq
L17:
movb $1, %dl
xorl %eax, %eax
; │ @ REPL[10]:3 within `foo'
retq
nopw %cs:(%rax,%rax)
; └