如何通过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
相关产品推荐
相关产品推荐

