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

如何用Criterion对带两个输入的Haskell函数做基准测试?

解决多参数函数的Criterion基准测试问题

针对你的问题,核心是利用Haskell的柯里化特性或者uncurry函数来适配Criterion的单参数基准测试接口,下面是两种可行方案:

方案1:柯里化分步传参

Criterion的whnf/nf要求传入单参数函数和对应的参数。对于你的双参数函数fun,可以先传入第一个参数l1,得到一个仅接受l2的单参数函数,再传给whnf:

benchmark 0 = defaultMain [
    bgroup "group1" [bench "test1" $ whnf (fun l1) l2
                    ]]

这样whnf会调用fun l1 l2并评估到弱首范式,符合你的测试需求。

方案2:用uncurry将双参数函数转为单参数元组函数

uncurry函数可以把a -> b -> c类型的双参数函数,转换成(a, b) -> c类型的单参数(元组)函数,这样就能直接用whnf传入元组参数:

benchmark 0 = defaultMain [
    bgroup "group1" [bench "test1" $ whnf (uncurry fun) (l1, l2)
                    ]]

为什么之前的写法有问题?

  • 你省略l2时,whnf fun l1实际测试的是柯里化过程的时间(也就是创建fun l1这个函数的时间),并没有真正执行fun l1 l2的计算,所以时间极短(纳秒级)。
  • whnf fun $ l1 l2是语法错误,因为l1是[Int]类型,不能作为函数调用l1 l2,这不符合Haskell的类型规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:42:13