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

如何通过Haskell Criterion获取完整测量时间以绘制箱线图?

Haskell Criterion基准测试问题解答

1. 累计时间转单次耗时的处理是否正确?

完全正确。reportMeasured返回的measTime是从基准测试启动到当前采样批次的累计总耗时,用相邻差值计算每个批次的单次耗时是标准做法。

你看到部分值超出汇总分析的范围很正常:Criterion的汇总统计(比如均值、置信区间)会通过重采样和异常值过滤来平滑结果,而原始采样的单次值会保留真实的系统噪声(比如线程调度、临时IO负载),出现极端值是合理的。

2. 能否获取完整的测量时间列表?

要看你需要的是哪种“完整时间列表”:

  • 采样批次的时间列表:你当前通过reportMeasured已经拿到了所有采样批次的累计时间,转成单次批次耗时就是完整的批次时间列表。
  • 每一次函数调用的原始时间:Criterion默认不会直接输出,因为它的设计是把多次函数调用打包成一个**批次(batch)**来测量总时间,以此降低单次测量的误差。如果确实需要单调用时间,可以强制每个批次只执行一次函数:
    config :: Config
    config = defaultConfig 
        { batchSize = 1  -- 每个批次仅运行1次函数
        -- 其他配置项保持不变
        }
    
    此时每个采样批次的耗时就是单次函数调用的时间,但这种方式会引入更大的测量噪声,因为单次调用的时间误差无法通过批次平均抵消。

另外你提到rawDataFile和template没生成,是因为benchmarkWith'只负责执行基准测试并返回报告,不会自动处理文件输出。改用defaultMainWith就能触发Criterion的完整输出流程:

main :: IO ()
main = defaultMainWith config [bench "my_function" $ nf (fun x) z]

这样rawDataFile指定的二进制文件会被生成,里面包含更详细的原始测量数据。

3. 是否可以调整样本数量?

当然可以,通过Config的两个参数控制:

  • measurements:设置实际采集的采样批次数量(默认会根据函数运行时长自动调整,你可以手动指定固定值,比如measurements = 20)。
  • resamples:设置用于统计分析的重采样次数(默认1000,数值越大统计结果越稳定,比如resamples = 2000)。

修改后的配置示例:

config :: Config
config = defaultConfig 
    { csvFile = Just "benchmark.csv"
    , verbosity = Verbose
    , rawDataFile = Just "rawbench.bin"
    , measurements = 20  -- 采集20个样本批次
    , resamples = 2000   -- 用2000次重采样做统计分析
    , batchSize = 1      -- 可选:每个批次仅执行1次函数调用
    }

内容的提问来源于stack exchange,提问作者Pompan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:57:02