runparallel是go中用于并行基准测试的核心方法,它通过启动多个goroutine并利用sync.waitgroup同步,使测试能真实模拟高并发场景下的性能表现;其使用pb.next()控制迭代,确保总执行次数为b.n且由多个goroutine分摊,默认并发数为gomaxprocs,可通过setparallelism调整;在对比sync.map与加锁map的性能时,测试显示在读写混合场景下后者可能更优,说明runparallel能有效揭示不同并发策略的实际开销;使用时需保证并发安全、避免共享状态污染、合理设计读写比例,并结合-race检测数据竞争,从而准确评估并发组件性能。

在 Go 语言中进行并行基准测试是评估代码并发性能的关键手段。
testing.B
RunParallel
下面详细介绍如何使用
RunParallel
RunParallel
*testing.B
sync.WaitGroup
立即学习“go语言免费学习笔记(深入)”;
它的基本用法如下:
func BenchmarkXXX(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
// 被测代码
}
})
}pb.Next()
true
for i := 0; i < b.N; i++
Next()
b.N
RunParallel
GOMAXPROCS
Go 的原生
map
sync.Map
map + sync.RWMutex
sync.Map
func BenchmarkSyncMap(b *testing.B) {
var m sync.Map
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
key := rand.Intn(1000)
m.Store(key, key)
m.Load(key)
}
})
}map + sync.RWMutex
func BenchmarkMutexMap(b *testing.B) {
var mu sync.RWMutex
m := make(map[int]int)
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
key := rand.Intn(1000)
mu.Lock()
m[key] = key
mu.Unlock()
mu.RLock()
_ = m[key]
mu.RUnlock()
}
})
}运行基准测试:
go test -bench=Benchmark -run=^$ -count=3
输出可能类似:
BenchmarkSyncMap-8 1000000 1200 ns/op BenchmarkMutexMap-8 2000000 800 ns/op
可以看到,在这个简单读写混合场景中,加锁的
map
sync.Map
sync.Map
RunParallel
默认使用
GOMAXPROCS
GOMAXPROCS
GOMAXPROCS=4 go test -bench=BenchmarkSyncMap
如果你想手动控制 goroutine 数量,可以结合
b.SetParallelism()
b.SetParallelism(2) // 使用 2 * GOMAXPROCS 个 goroutine b.RunParallel(...)
比如
SetParallelism(1)
SetParallelism(4)
pb.Next()
RunParallel
for i := 0; i < b.N; i++
b.N
-race
go test -bench=BenchmarkSyncMap -run=^$ -race
Store
Load
比如 90% 读,10% 写:
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
key := rand.Intn(1000)
if rand.Float32() < 0.9 {
m.Load(key)
} else {
m.Store(key, key)
}
}
})这样更贴近缓存类场景。
基本上就这些。
RunParallel
sync.Map
以上就是Golang并行基准测试怎么做 使用RunParallel方法实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号