3 回答
TA贡献1846条经验 获得超7个赞
[S]o 我想知道我是否可以做些什么来提高 Go 地图的性能?
不,那里没有。Go 基本上没有性能旋钮。
(请注意,Go 的map
类型是一个非常通用且健壮的哈希映射,它使用强加密哈希(如果可能)来防止攻击并强制使用随机密钥/迭代顺序。它是“完全通用的”,而不仅仅是“快速字典”。)
完全正确:有环境变量GOGC
可以“调整”GC。
TA贡献1895条经验 获得超3个赞
可能有一件事被忽视了,把整个练习变成了苹果和橘子:同步。在 Go 方面,您使用 Mutex,它在每次访问时都会进入内核。在 C# 方面,您使用 lock(){},它使用 SpinLock 的组合,并且仅在需要时回退到内核调用。由于您的测试无论如何都是在单个线程中执行的,因此 C# 甚至从未进入内核。
在 Go 中不鼓励使用互斥锁,而应该使用通道来进行同步。
几个建议: 1. 如果您想自己对地图/字典进行基准测试,请删除同步。2. 如果您想对并发性能进行基准测试,请使用正确的构造和范式编写您的测试。
干杯!
TA贡献1772条经验 获得超8个赞
我发现如果我缩小 1000000 到 100000,golang 速度会从 151.0087ms 变为 10.0005ms(15.1 乘法),而 csharp 版本从 65ms 变为 9ms(7.22 乘法),所以这意味着 golang 的 hashmap 难以处理大地图?
我写了一个简单的 go benchmark 程序,像这样
func BenchmarkIntMapGet100(b *testing.B) {
count := 100
setupIntMap(b, count)
b.ResetTimer()
for i:=0; i<b.N; i++{
_, _ = intMap[i%count]
}
}
我得到了结果
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 关注
- 166 浏览
添加回答
举报