要知道,一個關鍵k的地圖存在M1[k]v是非常簡單的Go。
if v, ok := M1[k]; ok {
// key exist
}
'v':非指標型別的值。
如果v很大,僅使用上述方法檢查特定鍵是否存在效率不高,因為它會將值加載v到記憶體中(即使我使用空白識別符號_代替v根據我的理解,請糾正我,如果我的這里的理解是錯誤的)。
有沒有一種有效的方法可以檢查 Map 中是否存在鍵(無需讀取/或在記憶體中分配值)?
我正在考慮創建一個新地圖M2[k]bool來存盤資訊并在M2每次我在M1.
uj5u.com熱心網友回復:
使用if _, ok := M1[k]; ok { }. 如果使用空白識別符號,則不會“加載”該值。
讓我們撰寫基準測驗來測驗它:
var m = map[int][1_000_000]int64{
1: {},
}
func BenchmarkNonBlank(b *testing.B) {
for i := 0; i < b.N; i {
if v, ok := m[1]; ok {
if false {
_ = v
}
}
}
}
func BenchmarkBlank(b *testing.B) {
for i := 0; i < b.N; i {
if _, ok := m[1]; ok {
if false {
_ = ok
}
}
}
}
運行go test -bench .,輸出為:
BenchmarkNonBlank-8 1497 763278 ns/op
BenchmarkBlank-8 97802791 12.09 ns/op
如您所見,使用空白識別符號,操作大約需要 10 ns。當我們將值分配給非空識別符號時,當值型別的大小約為 8 MB 時,它幾乎要 1 毫秒(幾乎慢十萬倍)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402271.html
