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\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 转:https://cloud.tencent.com/developer/article/1447903
Golang 函数耗时统计的更多相关文章
- springMVC Aspect AOP 接口耗时统计
在接口开发中,我们通常需要统计接口耗时,为后续接口性能做统计.在springMVC中可以用它的aop来记录日志. 1.在spring配置文件中开启AOP <!--*************** ...
- Android Activity启动耗时统计方案
作者:林基宗 Activity的启动速度是很多开发者关心的问题,当页面跳转耗时过长时,App就会给人一种非常笨重的感觉.在遇到某个页面启动过慢的时候,开发的第一直觉一般是onCreate执行速度太慢了 ...
- PHP array_count_values() 函数用于统计数组中所有值出现的次数。
定义和用法 array_count_values() 函数用于统计数组中所有值出现的次数. 本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数. 语法 array_count ...
- GO开发[四]:golang函数
函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个 ...
- 已知一个字符串S 以及长度为n的字符数组a,编写一个函数,统计a中每个字符在字符串中的出现次数
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 21:04 * @description ...
- golang函数学习笔记
golang函数特点: a.不支持重载,一个包不能有两个名字一样的函数 b.函数是一等公民,函数也是一种类型,一个函数可以赋值给变量 c.匿名函数 d.多返回值 例子1 func add(a, b ...
- GPU和CPU耗时统计方法
GPU端耗时统计 cudaEvent_t start, stop; checkCudaErrors(cudaEventCreate(&start)); checkCudaErrors(cuda ...
- golang 函数作为类型
golang 函数作为类型 package main import "fmt" type A func(int, int) func (f A)Serve() { fmt.Prin ...
- electron/nodejs实现调用golang函数
https://www.jianshu.com/p/a3be0d206d4c 思路 golang 支持编译成c shared library, 也就是系统中常见的.so(windows下是dll)后缀 ...
随机推荐
- 为Vim 添加vimgdb支持
为Vim 添加vimgdb支持 1. 下载最新的vim74的源码包 wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 2.下载vimgdb- ...
- Matlab函数kmeans
Matlab函数kmeans K-means聚类算法采用的是将N*P的矩阵X划分为K个类,使得类内对象之间的距离最大,而类之间的距离最小. 使用方法:Idx=Kmeans(X,K)[Idx,C]=Km ...
- Linux更新程序脚本
DATE=$(date +%Y%m%d_%H%M%S) cd /opt/anystreaming/transcoder/ mv dll/libmonitor_service.so "dll/ ...
- 修改小程序checkbox样式
未选中时的样式 checkbox .wx-checkbox-input { border-radius: 50%; height: 30rpx; width: 30rpx; margin-top: - ...
- BootStrap【四、插件】
BootStrap插件基于: 1.BootStrap.js 2.BootStrap.js基于JQuery data属性 1.通过data属性控制页面交互 2.$(document).off('.dat ...
- 智能指针原理及实现(2)unique_ptr
只允许基础指针的一个所有者. 可以移到新所有者(具有移动语义),但不会复制或共享(即我们无法得到指向同一个对象的两个unique_ptr). 替换已弃用的 auto_ptr. 相较于 boost::s ...
- go语言中regexp包中的函数和方法
// regexp.go ------------------------------------------------------------ // 判断在 b 中能否找到正则表达式 patter ...
- Delphi 方法的声明
- 《浏览器工作原理与实践》<03>HTTP请求流程:为什么很多站点第二次打开速度会很快?
一个 TCP 连接过程包括了建立连接.传输数据和断开连接三个阶段. 而 HTTP 协议,正是建立在 TCP 连接基础之上的.HTTP 是一种允许浏览器向服务器获取资源的协议,是 Web 的基础,通常由 ...
- Zabbix4.2Server端部署
一.安装 1.前期安装准备 前期准备一个大一点的分区准备用于zabbix 数据库的存放,为方便后期扩容,我们在这里选择新加一个磁盘并以LVM的方式进行挂载(此处省略虚拟机添加硬盘等操作) # df - ...