Golang 函数耗时统计
发布日期:2021-06-29 19:23:41
浏览次数:3
分类:技术文章
本文共 1530 字,大约阅读时间需要 5 分钟。
1.朴素方法
在函数起始位置计算当前时间,在函数结束位置算出耗时。
package mainimport ( "fmt" "time")func sum(n int) int { startT := time.Now() //计算当前时间 total := 0 for i:=1; i <= n; i++ { total += i } tc := time.Since(startT) //计算耗时 fmt.Printf("time cost = %v\n", tc) return total}func main() { count := sum(100) fmt.Printf("count = %v\n", count)}
编译运行输出:
time cost = 350nscount = 5050
2.简洁方法
计算当前时间与计算耗时放在两处,难免显得丑陋,且不易阅读。如果有多个函数需要统计耗时,那么多处书写重复的两行代码会造成代码冗余。由于 Golang 提供了函数延时执行的功能,借助 defer ,我们可以通过函数封装的方式来避免代码冗余。
package mainimport ( "fmt" "time")//@brief:耗时统计函数func timeCost(start time.Time){ tc:=time.Since(start) fmt.Printf("time cost = %v\n", tc)}func sum(n int) int { defer timeCost(time.Now()) total := 0 for i:=1; i <= n; i++ { total += i } return total}func main() { count := sum(100) fmt.Printf("count = %v\n", count)}
编译运行输出:
time cost = 1.574µscount = 5050
通过输出可以看到 sum() 耗时增加了,因为增加了一次 timeCost() 函数调用。不过相比于函数封装带来的便利与代码美观,新增的耗时是微不足道可以接受的。
3.优雅方法
每次调用耗时统计函数 timeCost() 都需要传入time.Now()
,重复书写time.Now()
无疑造成了代码冗余。我们在上面的基础上,进行进一步的封装,实现如下。
package mainimport ( "fmt" "time")//@brief:耗时统计函数func timeCost() func() { start := time.Now() return func() { tc:=time.Since(start) fmt.Printf("time cost = %v\n", tc) }}func sum(n int) int { defer timeCost()() //注意,是对 timeCost() 返回的函数进行延迟调用,因此需要加两对小括号 total := 0 for i:=1; i <= n; i++ { total += i } return total}func main() { count := sum(100) fmt.Printf("count = %v\n", count)}
编译运行输出:
time cost = 1.204µscount = 5050
参考文献
[1]
转载地址:https://dablelv.blog.csdn.net/article/details/92673425 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月28日 05时41分24秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
TypeScript 条件语句
2019-04-30
微信小程序 响应的数据绑定
2019-04-30
微信小程序框架
2019-04-30
微信小程序 场景值
2019-04-30
微信小程序 APP() 的那些事
2019-04-30
python 第一个程序 hello python
2019-04-30
python 注释
2019-04-30
python 变量类型
2019-04-30
Python int() 函数
2019-04-30
scrapy 框架安装
2019-04-30
关于Java接口interface定义的几点说明
2019-04-30
关于 Android 程序使用 Support Library 属性的几点说明
2019-04-30
关于Spinner控件几点说明
2019-04-30
关于fragment 嵌套的几点说明
2019-04-30
Java为什么需要static关键字
2019-04-30
Java数组声明、创建、初始化
2019-04-30
Java 自增自减运算符陷阱
2019-04-30
C#获取web.config配置文件内容
2019-04-30
asp.net 保存网页上的图片到本地
2019-04-30
Android 基于Http协议的文件上传
2019-04-30