我正在使用标准来对我的 Haskell 代码进行基准测试。我正在做一些需要随机数据的繁重计算。我已经像这样编写了我的主要基准文件:
main :: IO ()
main = newStdGen >>= defaultMain . benchmarks
benchmarks :: RandomGen g => g -> [Benchmark]
benchmarks gen =
[
bgroup "Group"
[
bench "MyFun" $ nf benchFun (dataFun gen)
]
]
我将基准和数据生成器保存在不同的模块中:
benchFun :: ([Double], [Double]) -> [Double]
benchFun (ls, sig) = fun ls sig
dataFun :: RandomGen g => g -> ([Double], [Double])
dataFun gen = (take 5 $ randoms gen, take 1024 $ randoms gen)
这行得通,但我有两个担忧。首先,生成随机数据所需的时间是否包含在基准测试中?我发现了一个涉及该主题的问题,但老实说,我无法将其应用于我的代码。为了检查这是否发生,我编写了一个包含在 IO monad 中的数据生成器的替代版本。我将基准列表放在 main 中,称为生成器,用 <- 提取结果,然后将其传递给基准函数。我没有看到性能上的差异。
我的第二个问题与生成随机数据有关。现在生成器一旦创建就不会更新,这会导致在一次运行中生成相同的数据。这不是一个主要问题,但是如果能正确地完成它会很好。是否有一种巧妙的方法可以在每个 data* 函数中生成不同的随机数据?“整洁”的意思是“不让数据函数在 IO 内获取 StdGen”?
编辑:正如下面评论中所述,我并不真正关心数据随机性。对我来说重要的是生成数据所需的时间不包含在基准测试中。