Опять же, как и в прошлый раз, есть два комментария.
На самом деле макрос работает медленнее
Рассмотрим этот код, который оценивает фактическое время, необходимое макросу и функции для завершения своей работы:
julia> x = ones(10^8);
julia> t1 = time_ns()
0x00006937ba4da19e
julia> @func!(x)
julia> t2 = time_ns()
0x00006939ebcb5c41
julia> Int(t2 - t1)
9420257955
julia>
julia> x = ones(10^8);
julia> t1 = time_ns()
0x0000693a0ee9452f
julia> func!(x)
julia> t2 = time_ns()
0x0000693a16ea941e
julia> Int(t2 - t1)
134303471
И вы видите, что функция значительно быстрее.Разница в том, что время расходуется в разные моменты (время компиляции и время выполнения, а @btime
измеряет время выполнения).
Макрос работает, только если его аргумент определен в глобальной области видимости
Например, следующий код завершается ошибкой:
julia> function test()
abc = [1,2,3]
@func!(abc)
abc
end
ERROR: LoadError: UndefVarError: abc not defined
while:
julia> function test()
abc = [1,2,3]
func!(abc)
abc
end
test (generic function with 1 method)
julia> test()
3-element Array{Int64,1}:
2
2
2
, поэтому функция и макрос на самом деле делают разные вещи.
В общем, я обычно рекомендую не делатьиспользуйте макросы, если для этого нет веских причин.