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 關注
- 152 瀏覽
添加回答
舉報