gotips 001: 一行代码测量函数的执行时间

💡 原文中文,约2000字,阅读约需5分钟。
📝

内容提要

Golang Tips是Phuong Le陆续发表的推文,介绍了使用defer来测量函数执行时间的方法。另外,还介绍了使用hrtime库进行性能测试的方法。

🔎

延伸解读

defer 计时为何能一行搞定

文章利用 defer 的参数在注册时即求值的特性,把 time.Now() 作为起始时间传入 TrackTime。函数返回时 defer 调用才执行,此时用 time.Since 算出耗时。因此只需在函数开头写一行 defer TrackTime(time.Now()),无需手动记录结束时间,就能测量整个函数的执行时间。

两种 TrackTime 写法的取舍

第一种写法直接传入 time.Now(),简单但每次都要自己获取开始时间。第二种写法传入名称字符串,由 TrackTime 内部记录开始时间并返回一个匿名函数,defer 实际调用的是这个匿名函数。它更通用,能通过名称区分不同测量点,适合日志记录,但调用时需多一对括号。

hrtime 适合更灵活的性能测试

除了标准 Benchmark,文章介绍了 hrtime 库。它既能像 time 包一样测量单段代码耗时,也能用 NewBenchmark 创建基准测试,并通过 Histogram 输出时间分布直方图。示例中测试 Sleep 1 微秒,在作者机器上实际休眠约 5 微秒,大部分落在 15 微秒以内,这比只看平均值更能反映真实波动。

❓

Q&A

如何使用defer测量函数的执行时间?

可以通过在函数内使用defer和TrackTime函数来测量执行时间,TrackTime会在函数返回时计算并打印出执行时间。

TrackTime函数的作用是什么?

TrackTime函数用于记录函数执行的起始时间,并在函数结束时计算和返回执行时间。

hrtime库有什么用途?

hrtime库是一个高精度计时与基准测试库,用于灵活地进行性能测试,并可以生成时间花费的直方图。

如何使用hrtime进行性能测试?

可以通过创建hrtime.NewBenchmark实例来进行性能测试,并使用bench.Histogram生成时间花费的直方图。

使用defer时如何传入辅助信息?

可以在TrackTime函数中传入一个字符串作为辅助信息,以便于日志记录和区分不同的测量。

defer和hrtime的测量方法有什么区别?

defer主要用于简单的函数执行时间测量,而hrtime提供更灵活的性能测试和时间分布分析功能。

🏷️

标签

➡️

继续阅读