3 回答

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
[S]o 我想知道我是否可以做些什么來(lái)提高 Go 地圖的性能?
不,那里沒(méi)有。Go 基本上沒(méi)有性能旋鈕。
(請(qǐng)注意,Go 的map
類型是一個(gè)非常通用且健壯的哈希映射,它使用強(qiáng)加密哈希(如果可能)來(lái)防止攻擊并強(qiáng)制使用隨機(jī)密鑰/迭代順序。它是“完全通用的”,而不僅僅是“快速字典”。)
完全正確:有環(huán)境變量GOGC
可以“調(diào)整”GC。

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
可能有一件事被忽視了,把整個(gè)練習(xí)變成了蘋果和橘子:同步。在 Go 方面,您使用 Mutex,它在每次訪問(wèn)時(shí)都會(huì)進(jìn)入內(nèi)核。在 C# 方面,您使用 lock(){},它使用 SpinLock 的組合,并且僅在需要時(shí)回退到內(nèi)核調(diào)用。由于您的測(cè)試無(wú)論如何都是在單個(gè)線程中執(zhí)行的,因此 C# 甚至從未進(jìn)入內(nèi)核。
在 Go 中不鼓勵(lì)使用互斥鎖,而應(yīng)該使用通道來(lái)進(jìn)行同步。
幾個(gè)建議: 1. 如果您想自己對(duì)地圖/字典進(jìn)行基準(zhǔn)測(cè)試,請(qǐng)刪除同步。2. 如果您想對(duì)并發(fā)性能進(jìn)行基準(zhǔn)測(cè)試,請(qǐng)使用正確的構(gòu)造和范式編寫您的測(cè)試。
干杯!

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊
我發(fā)現(xiàn)如果我縮小 1000000 到 100000,golang 速度會(huì)從 151.0087ms 變?yōu)?10.0005ms(15.1 乘法),而 csharp 版本從 65ms 變?yōu)?9ms(7.22 乘法),所以這意味著 golang 的 hashmap 難以處理大地圖?
我寫了一個(gè)簡(jiǎn)單的 go benchmark 程序,像這樣
func BenchmarkIntMapGet100(b *testing.B) {
count := 100
setupIntMap(b, count)
b.ResetTimer()
for i:=0; i<b.N; i++{
_, _ = intMap[i%count]
}
}
我得到了結(jié)果
BenchmarkIntMapGet10-4 100000000 15.6 ns/op
BenchmarkIntMapGet100-4 100000000 17.1 ns/op
BenchmarkIntMapGet1000-4 50000000 25.7 ns/op
BenchmarkIntMapGet10000-4 50000000 32.3 ns/op
BenchmarkIntMapGet100000-4 30000000 39.2 ns/op
BenchmarkIntMapGet1000000-4 20000000 67.2 ns/op
BenchmarkIntMapGet10000000-4 20000000 82.3 ns/op
- 3 回答
- 0 關(guān)注
- 201 瀏覽
添加回答
舉報(bào)