2 回答
TA贡献1900条经验 获得超5个赞
结果与数组大小非线性的原因是因为并非获取新填充数组所涉及的所有操作都与数组大小线性。例如,您需要内存分配,可以选择将分配的内存清零,循环填充数组,并且必须返回(复制)数组的内存。分配是一个很好的例子,它不应该与大小成线性关系,而且,复制内存也不应该是线性的(应该增加,但不是线性的)。
避免使用冗长的复合文字并询问需要清零并随后填充的新数组值的一种方法是准备好该值,然后将其分配给数组变量。
我的意思是有一个包级变量存储计算/填充的数组(最简单的填充是一个简单的循环),当您需要一个新的数组填充相同的数组时,只需分配存储的值:
var cache [N]int
func init() {
for i := range cache {
cache[i] = i
}
}
// If you now need a new array:
var result = cache
// Or re-init an existing array:
result = cache
如果您将其添加到您的基准中:
func BenchmarkArrayAssign(b *testing.B) {
var r [N]int
for n := 0; n < b.N; n++ {
r = cache
}
result = r
}
或者简单地:
func BenchmarkArrayAssign(b *testing.B) {
for n := 0; n < b.N; n++ {
result = cache
}
}
这将比您迄今为止最快的速度快ArrayLoopNamedReturn 两倍(当 时N = 1_000_000)。
BenchmarkArrayAssign-4 1000 1104829 ns/op
BenchmarkArrayLoop-4 500 3822005 ns/op
BenchmarkArrayLoopNamedReturn-4 500 2326498 ns/op
TA贡献1810条经验 获得超4个赞
正如您所说,您可以使用文字初始化数组,或者数组将具有默认的零值。如果您能够创建一个数组并稍后设置其内容,那么这两个时刻之间的任何读取访问都将是未定义的(就像在 C 中一样)。
我同意对大量元素使用数组文字是不切实际的,但这就是内存安全的代价:)
- 2 回答
- 0 关注
- 81 浏览
添加回答
举报