第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在不將所有值清零的情況下初始化一個(gè)長(zhǎng)Golang數(shù)組?

如何在不將所有值清零的情況下初始化一個(gè)長(zhǎng)Golang數(shù)組?

Go
12345678_0001 2023-07-10 16:28:58
在 Go 中創(chuàng)建數(shù)組時(shí),即使在初始化后立即設(shè)置不同的值,數(shù)組似乎也總是會(huì)被清零,例如當(dāng)該值應(yīng)設(shè)置為數(shù)組中的索引時(shí)。避免這種情況的一種方法是使用數(shù)組文字,例如a = [5]int{0,1,2,3,4},但對(duì)于長(zhǎng)數(shù)組來(lái)說(shuō)它變得不切實(shí)際。我想知道執(zhí)行初始化的最佳方法是什么。令人驚訝的是,對(duì)于大型數(shù)組,命名返回函數(shù)的性能優(yōu)于復(fù)合文字初始化。我創(chuàng)建了以下基準(zhǔn)來(lái)比較性能:package mainimport "testing"const N = 1000000var result [N]intfunc arrayLiteral() [N]int {? ? // Replace the 3 dots with the actual value? ? // I copy-pasted the output of an other program to do this? ? return [N]int{0,1,2,3,...,N-1}}func arrayLoopNamedReturn() (a [N]int) {? ? for i := 0; i < N; i++ {? ? ? ? a[i] = i? ? }? ? return}func arrayLoop() [N]int {? ? var a [N]int? ? for i := 0; i < N; i++ {? ? ? ? a[i] = i? ? }? ? return a}func BenchmarkArrayLoop(b *testing.B) {? ? var r [N]int? ? for n := 0; n < b.N; n++ {? ? ? ? r = arrayLoop()? ? }? ? result = r}func BenchmarkArrayLoopNamedReturn(b *testing.B) {? ? var r [N]int? ? for n := 0; n < b.N; n++ {? ? ? ? r = arrayLoopNamedReturn()? ? }? ? result = r}func BenchmarkArrayLiteral(b *testing.B) {? ? var r [N]int? ? for n := 0; n < b.N; n++ {? ? ? ? r = arrayLiteral()? ? }? ? result = r}結(jié)果:N = 10,000BenchmarkArrayLoop-8? ? ? ? ? ? ? ? ? ? ? 200000? ? ? ? ? ? ? 9041 ns/opBenchmarkArrayLoopNamedReturn-8? ? ? ? ? ?200000? ? ? ? ? ? ? 6327 ns/opBenchmarkArrayLiteral-8? ? ? ? ? ? ? ? ? ?300000? ? ? ? ? ? ? 4300 ns/opN = 100,000BenchmarkArrayLoop-8? ? ? ? ? ? ? ? ? ? ? ?10000? ? ? ? ? ? 191582 ns/opBenchmarkArrayLoopNamedReturn-8? ? ? ? ? ? 20000? ? ? ? ? ? ?76125 ns/opBenchmarkArrayLiteral-8? ? ? ? ? ? ? ? ? ? 20000? ? ? ? ? ? ?62714 ns/opN = 1,000,000BenchmarkArrayLoop-8? ? ? ? ? ? ? ? ? ? ? ? ?500? ? ? ? ? ?2635713 ns/opBenchmarkArrayLoopNamedReturn-8? ? ? ? ? ? ?1000? ? ? ? ? ?1537282 ns/opBenchmarkArrayLiteral-8? ? ? ? ? ? ? ? ? ? ?1000? ? ? ? ? ?1854348 ns/op觀察結(jié)果:我沒(méi)想到命名返回值會(huì)對(duì)循環(huán)產(chǎn)生影響,我認(rèn)為編譯器肯定會(huì)做一些優(yōu)化。對(duì)于 1,000,000,它變得比文字初始化更快。我期望線性縮放,但我不明白為什么這兩種方法都不是這種情況。我不知道如何解釋這一點(diǎn),盡管它似乎非?;?。有任何想法嗎 ?
查看完整描述

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


查看完整回答
反對(duì) 回復(fù) 2023-07-10
?
慕萊塢森

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à):)


查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 2 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)