首頁 >後端開發 >Golang >Go 的 Memset 等效項:如何有效率地初始化非零值數組?

Go 的 Memset 等效項:如何有效率地初始化非零值數組?

Barbara Streisand
Barbara Streisand原創
2025-01-04 02:29:40806瀏覽

Go's Memset Equivalent: How to Efficiently Initialize Arrays with Non-Zero Values?

Go Analog for Memset

問題:

問題:

Go Go以下的有效方法C 的memset 用非零值初始化數組,就像基本迴圈一樣慢。

答案:

雖然 Go 缺乏明確的 memset 函數,但有模擬其功能的最佳化方法。

func memsetLoop(a []int, v int) {
    for i := range a {
        a[i] = v
    }
}
循環-基於解決方案:

最簡單的替代方案是迭代的循環數組,為每個元素分配所需的值:

func memsetRepeat(a []int, v int) {
    if len(a) == 0 {
        return
    }
    a[0] = v
    for bp := 1; bp < len(a); bp *= 2 {
        copy(a[bp:], a[:bp])
    }
}
基於複製的解決方案:

Go 最佳化的copy() 函數可用來快速初始化陣列。透過手動設定第一個元素並重複複製填充部分,迭代次數減少為log(n):

效能比較:

For對於小數組,基於循環的解決方案稍微快一些。然而,隨著數組大小的增加,基於副本的解決方案由於迭代次數減少而變得明顯更快。
Array Size Loop-Based Copy-Based
100 elements 1.15x slower
1,000 elements 2.5x slower
10,000 elements 2x slower
100,000 elements 1.5x slower
基準結果:

以上是Go 的 Memset 等效項:如何有效率地初始化非零值數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn