0

0

Go语言中如何精准运行单个基准测试函数

花韻仙語

花韻仙語

发布时间:2025-10-07 13:00:58

|

923人浏览过

|

来源于php中文网

原创

Go语言中如何精准运行单个基准测试函数

本文详细介绍了在Go语言项目中,如何利用go test命令的-bench和-run标志,精准地运行指定的单个基准测试函数。通过结合正则表达式匹配基准测试名称并排除常规测试,开发者可以高效地聚焦于特定性能指标的评估。

go语言的开发实践中,性能优化是不可或缺的一环。当一个go包中包含多个基准测试文件(例如map1_benchmark_test.go、map2_benchmark_test.go)且每个文件内又定义了多个基准测试函数(例如benchmarkmaptravel、benchmarkmapget)时,我们常常需要单独运行某一个特定的基准测试函数,以便更专注于其性能表现。go语言的测试工具链提供了强大的命令行选项来实现这一目标。

使用 -bench 标志运行特定基准测试

go test命令的核心在于其灵活的标志选项。要运行匹配特定模式的基准测试函数,我们可以使用-bench或-test.bench标志。这两个标志的功能是等价的,它们接受一个正则表达式作为参数,只有函数名与该正则表达式匹配的基准测试才会被执行。

例如,假设我们有一个Go包,其中包含如下基准测试函数:

// mypackage_benchmark_test.go
package mypackage

import "testing"

// BenchmarkMapTravel 模拟遍历Map的性能
func BenchmarkMapTravel(b *testing.B) {
    m := make(map[int]int)
    for i := 0; i < 1000; i++ {
        m[i] = i
    }
    b.ResetTimer() // 重置计时器,排除初始化时间
    for i := 0; i < b.N; i++ {
        for range m {
            _ = i // 模拟操作
        }
    }
}

// BenchmarkMapGet 模拟从Map中获取元素的性能
func BenchmarkMapGet(b *testing.B) {
    m := make(map[int]int)
    for i := 0; i < 1000; i++ {
        m[i] = i
    }
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        _ = m[i%1000] // 模拟获取操作
    }
}

要单独运行BenchmarkMapTravel函数,可以使用以下命令:

go test -bench MapTravel

或者,使用完整的标志名:

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

go test -test.bench MapTravel

如果我们需要运行另一个函数BenchmarkMapGet,则相应地更改正则表达式:

go test -bench MapGet

重要提示:-bench参数是一个正则表达式。这意味着你可以使用更复杂的模式来匹配多个基准测试,例如go test -bench "Map"会运行所有函数名中包含"Map"的基准测试函数。

结合 -run 标志排除普通测试

默认情况下,go test在运行基准测试的同时,也会运行包中的所有普通测试(以Test开头的函数)。在某些场景下,我们可能只希望运行基准测试,而完全跳过普通测试,以避免不必要的开销或干扰。这时,可以结合使用-run或-test.run标志。

灵光
灵光

蚂蚁集团推出的全模态AI助手

下载

-run标志也接受一个正则表达式,用于匹配要运行的普通测试和示例函数。为了排除所有普通测试,我们可以提供一个永不匹配任何测试函数名的正则表达式。常用的模式包括:

  1. ^$: 这是一个匹配空字符串的正则表达式。由于所有测试函数名都不是空字符串,因此它不会匹配任何测试函数。
  2. 一个不可能匹配的字符串: 例如thisexpressionwontmatchanytest。

因此,要仅运行BenchmarkMapTravel基准测试并跳过所有普通测试,命令如下:

go test -bench MapTravel -run=^$

或者:

go test -bench MapTravel -run=thisexpressionwontmatchanytest

通过这种方式,go test命令将只关注并执行MapTravel相关的基准测试,而忽略包中的其他测试逻辑。

常用示例

以下是一些常用的命令示例,展示了如何灵活运用-bench和-run标志:

  • 运行所有基准测试,并跳过所有普通测试
    go test -bench . -run=^$

    (.匹配所有基准测试函数名,^$确保不运行任何普通测试)

  • 运行名为 BenchmarkMapTravel 的基准测试,并跳过所有普通测试
    go test -bench MapTravel -run=^$
  • 运行所有包含 "Get" 的基准测试,并跳过所有普通测试
    go test -bench "Get" -run=^$
  • 仅运行名为 BenchmarkMapTravel 的基准测试(同时会运行普通测试,如果存在)
    go test -bench MapTravel

注意事项

  • 标志等价性:go test -bench和go test -test.bench是等价的。同样,go test -run和go test -test.run也是等价的。在日常使用中,通常推荐使用更简洁的形式(如-bench和-run)。
  • 正则表达式:理解正则表达式对于精确匹配基准测试函数至关重要。如果函数名包含特殊字符或需要更复杂的匹配逻辑,请查阅Go语言正则表达式语法。
  • 获取帮助:如果对go test的标志有疑问,可以通过运行go help testflag命令来获取详细的帮助信息。这会列出所有可用的测试标志及其说明。

总结

通过灵活运用go test命令的-bench和-run标志,Go语言开发者可以精确控制基准测试的执行范围。这不仅有助于在大型项目中聚焦于特定的性能瓶颈,还能提高测试效率,确保性能分析的准确性和针对性。掌握这些命令,是高效进行Go语言性能优化的关键一步。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

249

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

213

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

234

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

528

2023.12.06

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

8

2026.01.22

热门下载

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

精品课程

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

共32课时 | 4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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