专栏首页C/C++基础Golang 函数耗时统计

Golang 函数耗时统计

1.朴素方法

在函数起始位置计算当前时间,在函数结束位置算出耗时。

package main

import (
    "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 = 350ns
count = 5050

2.简洁方法

计算当前时间与计算耗时放在两处,难免显得丑陋,且不易阅读。如果有多个函数需要统计耗时,那么多处书写重复的两行代码会造成代码冗余。由于 Golang 提供了函数延时执行的功能,借助 defer ,我们可以通过函数封装的方式来避免代码冗余。

package main

import (
    "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µs
count = 5050

通过输出可以看到sum()耗时增加了,因为增加了一次timeCost()函数调用。不过相比于函数封装带来的便利与代码美观,新增的耗时是微不足道可以接受的。

3.优雅方法

每次调用耗时统计函数timeCost()都需要传入time.Now(),重复书写time.Now()无疑造成了代码冗余。我们在上面的基础上,进行进一步的封装,实现如下。

package main

import (
    "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µs
count = 5050

参考文献

[1]golang 之 defer(统计函数执行时间)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#正则表达式判断字符串中是否有数…

                    int count = Regex.Matches(test, @"\d").Count;

    Dabelv
  • C#正则表达式判断字符串中是否有数…

                    int count = Regex.Matches(test, @"\d").Count;

    Dabelv
  • Golang须知知识点

    (1)同级目录不能放多个包,否则报编译错误; (2)实现一个接口需要实现接口中的所有方法。 (3)Golang中根据首字母的大小写来确定可以访问的权限。方法...

    Dabelv
  • java高并发系列 - 第21天:java中的CAS,你需要知道的东西

    需求:我们开发了一个网站,需要对访问量进行统计,用户每次发一次请求,访问量+1,如何实现呢?

    路人甲Java
  • 支持向量机实现分类案例

    输出表明:该手写体数字的数码图像数据共有1797条,并且每幅图片是由8X8=64的像素矩阵表示。在模型使用这些像素矩阵的时候,我们习惯将2D的图片像素矩阵逐行首...

    用户3577892
  • .NET Core开源Quartz.Net作业调度框架实战演练

    跟着阿笨一起玩NET
  • Tesseract文字训练,以及样本生成

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details...

    bear_fish
  • 频率计的使用说明

    在电子测量领域,频率是一个重要的参数,往往作为计 算的基础参量与参考数值,随着计算机网络和电子科学技术 的不断发展,频率的测量要求越来越高。这时一台高精度的频率...

    时频专家
  • go设计模式之简单工厂

    简单工厂是设计模式中最简单的一创建类型模式,通过一个手机的例子,来展示该模式的使用。

    暮雨
  • 开放申请 | 2019腾讯AI Lab犀牛鸟专项研究及访问学者计划启动

    2017年,为了开放腾讯AI Lab的研发资源,促进与学术界的深入合作,腾讯AI Lab联合腾讯高校合作设立了专门面向人工智能领域的腾讯AI Lab犀牛鸟专项...

    腾讯高校合作

扫码关注云+社区

领取腾讯云代金券