1. 程式人生 > >gmap,以及與sync.Map的效能比較

gmap,以及與sync.Map的效能比較

gf框架提供了幾個非常實用的併發安全容器,其中gmap就是專案開發中最常用的一個。

從執行效率上考慮,基於不同的需求場景,選擇合適的型別結構體,其執行效率是不一樣的,以下使用基準測試來對比各個型別的寫入效能(測試程式碼):

123456789101112131415 john@johnstation:~/Workspace/Go/GOPATH/src/gitee.com/johng/gf/g/container/gmap$go testgmap_test.go-bench=".*"goos:linuxgoarch:amd64BenchmarkIntBoolMap_Set-810000000171ns/opBenchmarkIntIntMap_Set-810000000181ns/opBenchmarkIntInterfaceMap_Set-810000000227ns/opBenchmarkIntStringMap_Set
-810000000271ns/opBenchmarkInterfaceInterfaceMap_Set-85000000331ns/opBenchmarkStringBoolMap_Set-85000000271ns/opBenchmarkStringIntMap_Set-85000000300ns/opBenchmarkStringInterfaceMap_Set-85000000363ns/opBenchmarkStringStringMap_Set-85000000394ns/opBenchmarkUintInterfaceMap_Set-810000000275ns/opPASSok   command-line-arguments37.024s

此外,需要說明的是,go語言從1.9版本開始引入了同樣支援併發安全的sync.Map,我們來看看基準測試結果怎麼樣:

1234567891011 john@johnstation:~/Workspace/Go/GOPATH/src/gitee.com/johng/gf/g/container/gmap$go test*.go-bench=".*"goos:linuxgoarch:amd64BenchmarkGmapSet-810000000181ns/opBenchmarkSyncmapSet-85000000366ns/opBenchmarkGmapGet-83000000082.6ns/opBenchmarkSyncmapGet-82000000095.7ns/opBenchmarkGmapRemove-82000000069.8ns/opBenchmarkSyncmapRmove-82000000093.6ns/opPASSok   command-line-arguments27.950s

檢視sync.Map的原始碼我們可以發現,其實現原理類似於gmap.InterfaceInterfaceMap這個型別結構體,但是效率卻沒有gmap.InterfaceInterfaceMap高。

因此可以發現,支援併發安全的gmap包的效率已經相當地高。