0

0

输出格式要求:Go语言函数耗时统计:毫秒级精度实现教程

DDD

DDD

发布时间:2025-08-19 17:46:01

|

789人浏览过

|

来源于php中文网

原创

输出格式要求:Go语言函数耗时统计:毫秒级精度实现教程

本文将深入探讨如何在Go语言中测量函数的执行时间,并以毫秒为单位返回结果。正如摘要中所述,我们将利用defer关键字和time包,实现一个简洁且易于使用的耗时统计方案。

go语言提供了强大的时间处理能力,结合defer关键字,可以方便地实现函数执行时间的测量。以下是一种常用的方法:

package main

import (
    "log"
    "time"
)

// trace 函数记录函数开始执行的时间
func trace(s string) (string, time.Time) {
    log.Println("START:", s)
    return s, time.Now()
}

// un 函数计算函数执行的耗时,并打印日志
func un(s string, startTime time.Time) {
    endTime := time.Now()
    elapsed := endTime.Sub(startTime)
    log.Printf("  END: %s, Elapsed time: %v\n", s, elapsed)
    log.Printf("  END: %s, Elapsed time in milliseconds: %dms\n", s, elapsed.Milliseconds())
}

// 示例函数
func someFunction() {
    defer un(trace("someFunction")) // 使用defer调用un函数,确保在函数退出时执行

    // 模拟一些耗时操作
    time.Sleep(100 * time.Millisecond)
    log.Println("Doing some work...")
    time.Sleep(200 * time.Millisecond)
}

func main() {
    someFunction()
}

代码解释:

  1. trace(s string) (string, time.Time): 这个函数用于记录函数开始执行的时间。它接收一个字符串s作为函数名或标识符,打印一条日志信息,并返回该字符串和当前时间。
  2. un(s string, startTime time.Time): 这个函数用于计算函数执行的耗时。它接收函数名s和开始时间startTime作为参数,计算结束时间与开始时间的差值,并打印包含函数名和耗时的日志信息。这里使用 elapsed.Milliseconds() 将耗时转换为毫秒。
  3. someFunction(): 这是一个示例函数,用于演示如何使用trace和un函数来测量函数的执行时间。defer un(trace("someFunction"))这行代码是关键。trace("someFunction")会在someFunction函数开始时执行,记录开始时间。defer un(...)则保证了un函数会在someFunction函数执行完毕后执行,无论someFunction函数是否发生panic。
  4. main(): 主函数,调用someFunction()来执行示例。

运行结果示例:

2023/10/27 10:00:00 START: someFunction
2023/10/27 10:00:00 Doing some work...
2023/10/27 10:00:00   END: someFunction, Elapsed time: 300.000000ms
2023/10/27 10:00:00   END: someFunction, Elapsed time in milliseconds: 300ms

注意事项:

  • 精度问题: 虽然代码中使用了time.Now()和time.Sub()来获取和计算时间,但是由于受到系统时钟的精度限制,测量结果可能存在一定的误差。如果需要更高的精度,可以考虑使用更高级的时间测量方法。
  • 日志输出: 示例代码中使用了log.Println()和log.Printf()函数进行日志输出。这些日志输出操作本身也会消耗一定的时间,可能会对测量结果产生影响。如果需要非常精确的测量结果,可以考虑移除日志输出操作。
  • 并发环境: 在并发环境中,多个goroutine可能会同时调用trace和un函数,导致日志输出混乱。为了解决这个问题,可以使用互斥锁来保护日志输出操作。

总结:

AI发型设计
AI发型设计

虚拟发型试穿工具和发型模拟器

下载

立即学习go语言免费学习笔记(深入)”;

通过利用Go语言的defer关键字和time包,我们可以方便地实现函数执行时间的测量。这种方法简单易用,适用于大多数场景。但是,在需要高精度测量或并发环境下,需要注意精度问题和日志输出问题,并采取相应的措施来解决。 这种方案可以很方便的嵌入到你的代码中,用于性能分析和调试。 请注意,实际的函数执行时间会受到多种因素的影响,例如CPU负载、内存访问速度等。因此,多次运行并取平均值可以获得更准确的结果。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

72

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

280

2023.11.28

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

277

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

252

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.3万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.4万人学习

Go 教程
Go 教程

共32课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号