2 回答

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
結(jié)果與數(shù)組大小非線性的原因是因?yàn)椴⒎谦@取新填充數(shù)組所涉及的所有操作都與數(shù)組大小線性。例如,您需要內(nèi)存分配,可以選擇將分配的內(nèi)存清零,循環(huán)填充數(shù)組,并且必須返回(復(fù)制)數(shù)組的內(nèi)存。分配是一個(gè)很好的例子,它不應(yīng)該與大小成線性關(guān)系,而且,復(fù)制內(nèi)存也不應(yīng)該是線性的(應(yīng)該增加,但不是線性的)。
避免使用冗長(zhǎng)的復(fù)合文字并詢問(wèn)需要清零并隨后填充的新數(shù)組值的一種方法是準(zhǔn)備好該值,然后將其分配給數(shù)組變量。
我的意思是有一個(gè)包級(jí)變量存儲(chǔ)計(jì)算/填充的數(shù)組(最簡(jiǎn)單的填充是一個(gè)簡(jiǎn)單的循環(huán)),當(dāng)您需要一個(gè)新的數(shù)組填充相同的數(shù)組時(shí),只需分配存儲(chǔ)的值:
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
如果您將其添加到您的基準(zhǔn)中:
func BenchmarkArrayAssign(b *testing.B) {
var r [N]int
for n := 0; n < b.N; n++ {
r = cache
}
result = r
}
或者簡(jiǎn)單地:
func BenchmarkArrayAssign(b *testing.B) {
for n := 0; n < b.N; n++ {
result = cache
}
}
這將比您迄今為止最快的速度快ArrayLoopNamedReturn 兩倍(當(dāng) 時(shí)N = 1_000_000)。
BenchmarkArrayAssign-4 1000 1104829 ns/op
BenchmarkArrayLoop-4 500 3822005 ns/op
BenchmarkArrayLoopNamedReturn-4 500 2326498 ns/op

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
正如您所說(shuō),您可以使用文字初始化數(shù)組,或者數(shù)組將具有默認(rèn)的零值。如果您能夠創(chuàng)建一個(gè)數(shù)組并稍后設(shè)置其內(nèi)容,那么這兩個(gè)時(shí)刻之間的任何讀取訪問(wèn)都將是未定義的(就像在 C 中一樣)。
我同意對(duì)大量元素使用數(shù)組文字是不切實(shí)際的,但這就是內(nèi)存安全的代價(jià):)
- 2 回答
- 0 關(guān)注
- 166 瀏覽
添加回答
舉報(bào)