我注意到我正在使用的@generated
函数有时会分配,有时不依赖于其中一个参数。
我已将其缩小到这个简单的案例。 分配免费添加的截止似乎归结为添加20个或更多元素。
19罚款20不是。 加两次10也没关系。
参见代码;
function add19(x)
@inbounds ret = x[1]+ x[2]+ x[3]+ x[4]+ x[5]+ x[6]+ x[7]+ x[8]+ x[9]+ x[10]+ x[11]+ x[12]+ x[13]+ x[14]+ x[15]+ x[16]+ x[17]+ x[18]+ x[19]
ret
end
function add20(x)
@inbounds ret = x[1]+ x[2]+ x[3]+ x[4]+ x[5]+ x[6]+ x[7]+ x[8]+ x[9]+ x[10]+ x[11]+ x[12]+ x[13]+ x[14]+ x[15]+ x[16]+ x[17]+ x[18]+ x[19]+ x[20]
ret
end
function add10twice(x)
@inbounds ret = (x[1]+ x[2]+ x[3]+ x[4]+ x[5]+ x[6]+ x[7]+ x[8]+ x[9]+ x[10]) + ( x[11]+ x[12]+ x[13]+ x[14]+ x[15]+ x[16]+ x[17]+ x[18]+ x[19]+ x[20])
ret
end
时间/分配(适用于a = rand(Int8, 100)
@btime add19($a)
52.542 ns(0分配:0字节)@btime add20($a)
789.929 ns(20个分配:336个字节)@btime add10twice($a)
80.959 ns(0分配:0字节)那么这里发生了什么?
(我有一个与varargs如何处理有关的理论)