Julia模块内子函数添加@btime基准测试抛出异常问题求助
问题原因
你直接在SetupProblem内部的Compute2DGrid调用前添加@btime抛出异常,是因为@btime宏展开后会生成多次重复运行被测代码、自动采样统计的逻辑,会直接干扰原函数的执行流、改变返回值结构,和你原有的业务逻辑冲突,因此触发报错。
解决方案
方案1:不修改原模块,直接测试内部函数
Julia支持直接访问模块内未导出的函数,你可以手动构造和SetupProblem内部一致的参数,直接对Compute2DGrid做基准测试:
using .SetupMod using BenchmarkTools # 构造和SetupProblem内部完全一致的MeshParams参数 mesh_params = SetupMod.MeshParams(NumElsX = 1, NumElsY = 32, LenY = 50.0f0, LenX = 50.0f0/32) # 基准测试,注意对变量加$插值,避免运行时类型不稳定导致的测试误差 @btime $SetupMod.Compute2DGrid(Float32, $mesh_params)
方案2:修改模块函数,调用时自动输出耗时
如果需要在执行SetupProblem的同时统计内部函数耗时,可以用轻量的@elapsed宏替换@btime,将耗时打印或作为额外返回值输出:
# 修改SetupMod模块内的SetupProblem函数 function SetupProblem(T) ModelConst = MeshParams( NumElsX = 1, NumElsY = 32, LenY = 50., LenX = 50/32) AnalysisConst = AnalysisConsts(LoadStpsNum = 40, g = 9.81, NumMP=2, MPType='M') # 统计耗时同时保留原返回结果 compute_time = @elapsed grid_res = Compute2DGrid(T, ModelConst) @info "Compute2DGrid运行耗时:$(compute_time * 1e6) 微秒" return grid_res end
修改后直接调用即可看到耗时输出:
using .SetupMod SetupMod.SetupProblem(Float32)
如果需要更完整的基准统计数据(中位数、标准差、内存分配等),可以返回BenchmarkTools的基准对象:
# 修改模块内的SetupProblem函数,注意要先在模块内导入BenchmarkTools using BenchmarkTools function SetupProblem(T) ModelConst = MeshParams( NumElsX = 1, NumElsY = 32, LenY = 50., LenX = 50/32) AnalysisConst = AnalysisConsts(LoadStpsNum = 40, g = 9.81, NumMP=2, MPType='M') # 生成基准测试结果 bm_res = @benchmark Compute2DGrid($T, $ModelConst) # 保留原逻辑的返回值 grid_res = Compute2DGrid(T, ModelConst) return grid_res, bm_res end
调用后即可查看完整基准结果:
using .SetupMod using BenchmarkTools res, bm = SetupMod.SetupProblem(Float32) display(bm)
内容的提问来源于stack exchange,提问作者user16570427
相关产品推荐
相关产品推荐

