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

