为什么添加20个元素会导致分配,但添加19个元素则不会

时间:2017-12-01 00:53:10

标签: memory julia variadic-functions

我注意到我正在使用的@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如何处理有关的理论)

0 个答案:

没有答案