如何在BenchmarkTools的@benchmark中正确收集函数返回值?
解决方法
问题出在@benchmark的作用域隔离机制——你在基准测试代码里定义的y,teardown代码根本访问不到,所以才会报y未定义的错误。而且直接把收集操作塞进基准测试代码会干扰计时结果,得用不影响基准测试的方式来收集返回值。
推荐用下面的写法:
using BenchmarkTools function foo(x) x + 1 end results = [] @benchmark begin val = foo(x) $(push!(results, val)) # 用$()包裹收集操作,这部分不会被计入基准测试时间 end setup=(x=3)
原理说明
$()是BenchmarkTools的特殊语法,被它包裹的代码会在计时范围之外执行,所以push!操作不会干扰foo(x)的基准测试结果。- 每次基准测试运行
foo(x)后,会立刻把返回值存入results数组,实现收集需求。
如果你需要更精细地控制运行次数,也可以手动创建基准对象并迭代运行:
using BenchmarkTools function foo(x) x + 1 end results = [] # 创建基准配置,指定setup逻辑 bm = @benchmarkable foo(x) setup=(x=3) # 手动运行指定次数,收集返回值 for _ in 1:10000 # 模拟基准测试的setup和函数调用 local x = 3 val = foo(x) push!(results, val) # 如果你需要单独计时,可以在这里用@elapsed之类的工具 end
内容的提问来源于stack exchange,提问作者AlexNe
相关产品推荐
相关产品推荐

