最直接的方式是在调用排序函数前后用 time.Now() 和 time.Since() 统计耗时,无需修改排序函数本身;例如 start := time.Now(); sort.Slice(data, ...); elapsed := time.Since(start)。

用 time.Now() 和 time.Since() 包裹排序调用
最直接的方式不是改排序函数本身,而是统计它被调用的耗时。Go 标准库的 sort.Slice() 或自定义快排函数都是普通函数调用,可以在外部用时间戳前后采样:
time.Since()
- 保持原快排函数纯算法:不引入
time包,不打印,不返回耗时 - 新增一个带统计的包装函数,例如
QuickSortWithTime([]int) (time.Duration) - 若需同时返回结果和耗时,用两个返回值:
func QuickSortWithTime(data []int) ([]int, time.Duration),注意传参时用data[:]避免意外修改原切片
避免常见性能误判:小数据量 + 未禁用 GC 干扰
对少于 100 个元素的切片测快排耗时,结果常是 0s 或抖动极大,因为纳秒级操作低于计时器分辨率。这时要:
- 用足够大的测试数据(如
make([]int, 100000)) - 循环多次取平均(但注意别让编译器优化掉空循环)
- 临时禁用 GC 影响:
debug.SetGCPercent(-1)调用前,结束后再设回原值(仅限测试,勿在生产用) - 别在
fmt.Println()后立刻测时长——I/O 可能阻塞,应把time.Now()放在真正排序开始前一刻
想长期监控?用 pprof 替代手打日志
如果目标不是单次调试,而是观察服务中排序函数的真实开销分布,硬编码 time.Now() 会快速变成日志噪音。这时候该上 Go 自带的分析工具:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 启动 HTTP pprof 端点:
import _ "net/http/pprof",然后http.ListenAndServe(":6060", nil) - 运行程序后访问
http://localhost:6060/debug/pprof/profile?seconds=30,它会采集 30 秒 CPU 使用,快排热点自然浮现 - 配合
go tool pprof查看函数耗时占比,比自己算Since()更可靠——它不依赖你选的起止位置,而是基于采样中断
手动加时统计适合验证逻辑或单元测试,真要看性能瓶颈,pprof 的采样机制更贴近真实运行态。尤其当快排被嵌在 HTTP handler 或 goroutine 里时,外围耗时远不止算法本身。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










