zoukankan      html  css  js  c++  java
  • Golang 函数耗时统计

     

       当时候需要去计算一段代码或一个程序所消耗时间的时候,就需要进行统计时间,用程序去计算某一段代码的执行所需要的时间远比用眼睛直接去看程序运行时间高很多。

       go语言中的time包中提供了函数来提供计算消耗时间,具体的使用方式如下案例所示:

    bT := time.Now()            // 开始时间

    eT := time.Since(bT)      // 从开始到当前所消耗的时间

    fmt.Println("Run time: ", eT)

     

    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
    ", tc)
        return total
    }
    
    func main() {
        count := sum(100)
    	fmt.Printf("count = %v
    ", 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
    ", 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
    ", 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
    ", 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
    ", count)
    }

    编译运行输出:

    time cost = 1.204µs
    count = 5050




    转:https://cloud.tencent.com/developer/article/1447903

  • 相关阅读:
    HashMap(HashSet)的实现
    C/C++ 安全编码 —— 指针与内存
    AlexNet神经网络结构
    查看,修改动态组成员/通讯组
    刷新已禁用用户邮箱状态
    监控DAG状态
    AD诊断命令
    PowerShell管理Exchange
    TCP连接(Time_Wait、Close_Wait)说明
    IIS配置(安装IIS、.Net、更改IIS Log目录位置)
  • 原文地址:https://www.cnblogs.com/unqiang/p/11757086.html
Copyright © 2011-2022 走看看