英文:
Benchmark Go code and goroutines
问题
我想对一个名为test()
的函数进行基准测试,使用不同数量的线程来执行它。
没有使用goroutines:
var t1 = time.Now()
test()
var elapsed1 = time.Since(t1)
> 1纳秒/操作
使用goroutines:
runtime.GOMAXPROCS(1)
var t1 = time.Now()
go test()
var elapsed1 = time.Since(t1)
> 1.10^-6纳秒/操作
我的测试函数:
func test() {
for i := 0; i < 1000000000; i++ {
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
}
}
- 在这种情况下,使用goroutines对
test()
函数进行了良好的基准测试吗? - 如何才能达到0.001纳秒/操作?看起来速度太快了。(2.5GHz Intel Core i7)
- 使用
runtime.GOMAXPROCS(n)
和使用n个线程是等效的吗?
英文:
I would like to benchmark a function: test()
, with different numbers of threads working on it.
Without goroutines:
var t1 = time.Now()
test()
var elapsed1 = time.Since(t1)
> 1 ns / operation
With goroutines:
runtime.GOMAXPROCS(1)
var t1 = time.Now()
go test()
var elapsed1 = time.Since(t1)
> 1.10^-6 ns / operation
My test function:
func test() {
for i := 0; i < 1000000000; i++ {
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
float_result = f1 + f2
float_result = f1 - f2
float_result = f1 * f2
float_result = f1 / f2
}
}
- Is the test() function well benchmarked when I use goroutines in this case?
- How is it possible to reach 0.001ns / operation? It looks to be way too fast. (2.5GHz Intel Core i7)
- Is the use of goroutines with
runtime.GOMAXPROCS(n)
equivalent to use n threads ?
答案1
得分: 8
你没有测量test()
运行的时间,而是测量了使用go test()
调用/创建新goroutine所需的时间。
你需要等待goroutine完成,例如使用sync.WaitGroup。
// 在你的main包中的某处
var wg sync.WaitGroup
func test() {
// test()的第一行应该是
wg.Add(1)
defer wg.Done()
...
}
// 基准测试
runtime.GOMAXPROCS(1)
var t1 = time.Now()
go test()
wg.Wait()
var elapsed1 = time.Since(t1)
英文:
You are not measuring the time that test()
runs, but the time it takes to call/create a new goroutine with go test()
.
You need to wait for your goroutine(s) to finish, for example by using a sync.Waitgroup.
// somewhere in your main package
var wg sync.WaitGroup
func test() {
// first lines in test() should be
wg.Add(1)
defer wg.Done()
...
}
// benchmark
runtime.GOMAXPROCS(1)
var t1 = time.Now()
go test()
wg.Wait()
var elapsed1 = time.Since(t1)
答案2
得分: 1
你正在尝试对一个非常小的东西进行基准测试,以至于测量误差占主导地位。你应该调整基准测试的迭代次数,直到基准函数的持续时间足够长,可以可靠地计时。你的基准测试应该运行大约一秒钟才有意义。
英文:
You are tring to benchmark something so small that measurement error dominates. Your benchmark iterations should be adjusted until the benchmark function lasts long enough to be timed reliably.Your benchmark should run for about one second to be meaningful.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论