在 C 中,memset 函數可以有效地使用指定值初始化數組。然而,Go 缺乏直接的 memset 支援。本文探討了實現類似功能的幾種替代方法。
使用循環的簡單實現是:
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
優化方法利用高效的copy( ) 函數:
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]) } }
此解類似bytes.Repeat()的實現。若要建立填入相同值的新 []byte,建議使用 bytes.Repeat()。
效能基準揭示了memsetRepeat() 相對於memsetLoop() 的優越性,因為陣列大小增加:
Array Size | memsetLoop | memsetRepeat | Improvement |
---|---|---|---|
100 | ~1.15x slower | ~1.15x faster | |
1,000 | ~2.5x slower | ~2.5x faster | |
10,000 | ~2x slower | ~2x faster | |
100,000 | ~1.5x slower | ~1.5x faster |
大約3800-4000 個元素, memsetRepeat() 提供了大約3.2 倍的效能提升。
雖然 Go 本身不支援 memset,但 memsetLoop() 和 memsetRepeat() 為使用非初始化數組提供了有效的替代方案零值。 memsetRepeat(),利用 copy(),成為較大陣列的最佳解。
以上是如何在 Go 中高效初始化數組:memset 替代方案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!