gpt4 book ai didi

haskell - 初始化标准中的基准并从结果中排除初始化时间

转载 作者:行者123 更新时间:2023-12-02 16:48:18 26 4
gpt4 key购买 nike

我需要对 IO 内的一些代码进行基准测试,并且标准很好地支持了这一点。但我想执行一些初始化步骤(每个基准测试都不同)。天真的方法:

main = defaultMain
[ bench "the first" $ do
initTheFirst
theFirst
cleanUpTheFirst
, bench "the second" $ do
initTheSecond
theSecond
cleanUpTheSecond
]

但它会为每次基准测试运行执行初始化和清理(默认情况下为 100 次),并包括最终结果的初始化时间。是否可以排除初始化时间?

添加:该代码使用全局状态(实际上是 mongodb),因此我无法同时准备两个初始状态。

最佳答案

这是 argiopeweb 建议的使用自定义 main 的解决方案:

import Control.Monad
import Control.Monad.IO.Class
import Control.Concurrent
import Criterion
import Criterion.Config
import Criterion.Monad
import Criterion.Environment

main :: IO ()
main = myMain [
(initTheFirst, theFirst),
(initTheSecond, theSecond)
]

initTheFirst :: IO ()
initTheFirst = do
putStrLn "initializing the first"
threadDelay 1000000

theFirst :: Benchmark
theFirst = bench "the first" $ do
return () :: IO ()

initTheSecond :: IO ()
initTheSecond = do
putStrLn "initializing the second"
threadDelay 1000000

theSecond :: Benchmark
theSecond = bench "the second" $ do
return () :: IO ()

myMain :: [(IO (), Benchmark)] -> IO ()
myMain benchmarks = withConfig defaultConfig $ do
env <- measureEnvironment
forM_ benchmarks $ \(initialize, benchmark) -> do
liftIO $ initialize
runAndAnalyse (const True) env benchmark

输出:

warming up
estimating clock resolution...
mean is 1.723574 us (320001 iterations)
found 1888 outliers among 319999 samples (0.6%)
1321 (0.4%) high severe
estimating cost of a clock call...
mean is 43.45580 ns (13 iterations)
found 2 outliers among 13 samples (15.4%)
2 (15.4%) high severe
initializing the first

benchmarking the first
mean: 7.782388 ns, lb 7.776217 ns, ub 7.790563 ns, ci 0.950
std dev: 36.01493 ps, lb 29.29834 ps, ub 52.51021 ps, ci 0.950
initializing the second

benchmarking the second
mean: 7.778543 ns, lb 7.773192 ns, ub 7.784518 ns, ci 0.950
std dev: 28.85100 ps, lb 25.59891 ps, ub 32.85481 ps, ci 0.950

您可以看到 init* 函数仅被调用一次,并且不会影响基准测试结果。

关于haskell - 初始化标准中的基准并从结果中排除初始化时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19141036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com