You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:22:03