我想使用标准对具有两个输入的函数进行基准测试。然而,根据标准进行基准测试的函数似乎只能接受一个输入。我对 Haskell 很陌生,我确信这里已经有这个问题的答案,但我找不到它们。
我的设置是这样的,其中调用基准测试时使用
Int
确定要测试哪个 bgroup
。我尝试使示例尽可能简单。
import Criterion.Main ( bench, bgroup, whnf, defaultMain, nf )
benchmark :: Int -> IO ()
benchmark 0 = defaultMain [
bgroup "group1" [bench "test1" $ whnf fun l1 l2
]]
main :: IO ()
main = do
benchmark 0
相关声明为
fun :: [Int] -> [Double] -> [[Double]]
l1 :: [Int]
l2 :: [Double]
如果我省略
l2
,程序可以运行,但运行时间将以纳秒为单位,而我知道这个函数一次迭代大约需要一分钟。我虽然将呼叫更新为 whnf fun $ l1 l2
就可以了,但事实并非如此。
如何更新对
fun
的调用以便我可以传递两个变量?
我查看了标准文档,它说:
第二个将导致结果被评估为弱头正常形式(Haskell 默认值):
whnf :: (a -> b) -> a -> Benchmarkable
正如这两种类型所表明的那样,当您想要对函数进行基准测试时, 您必须提供两个值:
- 第一个元素是函数,包含除最后一个参数之外的所有参数。
- 第二个元素是函数的最后一个参数。
所以:
bench "test1" $ whnf (fun l1) l2