benchmark函数必须以benchmark开头并接收*testing.b参数,否则go test -bench会忽略;命名建议为benchmarkquicksort以便筛选,且必须用b.n控制循环次数。
为什么 Benchmark 函数必须以 Benchmark 开头且接收 *testing.B
Go 的测试框架只识别符合命名规范和签名的函数作为基准测试入口。如果写成 TestSort 或参数是 *testing.T,go test -bench 会直接忽略——它根本不会执行你写的逻辑。
实操要点:
-
Benchmark后建议接具体算法名,比如BenchmarkQuickSort,方便-bench=Quick精准筛选 - 必须调用
b.N控制循环次数,不能自己写for i := 0; i —— 否则 <code>b.ResetTimer()和统计逻辑失效 - 耗时操作(如数据生成)应放在
b.ResetTimer()之前,避免计入基准时间
如何避免切片复用导致的排序结果污染
多次调用 sort.Ints() 时若反复使用同一底层数组,前一次排序会改写原始数据,后续 benchmark 实际测的是“已排好序的数组”的再排序,结果严重失真。
正确做法: