标签: haskell-criterion

图形标准基准采用不同的时间量级

我有一个Criterion基准测试,每个bgroup测试对应一个测试,并且每个测试中bgroup有两个bench不同选项的测试值.例如:

main = defaultMain
    [bgroup "test1" [bench "v1" test1_1, bench "v2" test1_2]
    ,bgroup "test2" [bench "v1" test2_1, bench "v2" test2_2
    -- lots more tests
    ]
Run Code Online (Sandbox Code Playgroud)

在每个测试中bgroup,两个bench测试是可比的.但是,test1需要2000微秒,而test2需要45微秒.概览图(对我想要做的最有用)在同一轴上显示不同的测试,因此我可以清楚地看到差异test1,但test2很难看到.

是否可以将每个标准化bgroup用于绘图?或者在不同的轴上显示它们?或者我应该转储CSV数据并绘制我想要的内容吗?

haskell haskell-criterion

7
推荐指数
1
解决办法
258
查看次数

在Criterion中进行基准测试之前强制评估函数输入

在对Criterion中的函数进行基准测试之前,如何强制评估函数的输入?我试图对一些函数进行基准测试,但是想要排除评估输入thunk的时间.有问题的代码使用未装箱的向量进行输入,对于Int向量不能深入研究.下面的示例代码段:

-- V is Data.Vector.Unboxed
shortv = V.fromList [1..10] :: V.Vector GHC.Int.Int16
intv = V.fromList [1..10] :: V.Vector GHC.Int.Int32

main :: IO ()
main = defaultMain [
          bench "encode ShortV" $ whnf encodeInt16V shortv
          ,bench "encode IntV" $ whnf encodeInt32V intv
       ]
Run Code Online (Sandbox Code Playgroud)

标准基准包括构建shortv的时间,以及在对上述函数进行基准测试时的intv输入.标准测量值如下 - 每个函数测量约400ns,似乎也包括输入的构建时间:

benchmarking encode ShortV
mean: 379.6917 ns, lb 378.0229 ns, ub 382.4529 ns, ci 0.950
std dev: 10.79084 ns, lb 7.360444 ns, ub 15.89614 ns, ci …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation haskell-criterion

6
推荐指数
1
解决办法
377
查看次数

标准的能力

我在这里找到了一些使用标准的旧例子.看起来好像在2009年,它支持绘制图形的命令行选项.

现在,当我导入标准0.6时,将它包装在一个基本的应用程序中(以测试它)并说./application --help它只给出了很少的可用选项而且与绘图无关.在我看来,对于输出格式和功能而言,它在2009年拥有的功能比2012年更多?

似乎有一个标准到html创建基本的html报告,但没有任何接近例如png输出显示在上面的网站或标准源数据包的示例目录中.

我在哪里可以找到准确和最新的信息?

./application --help

Usage: application [OPTIONS] [BENCHMARKS]
  -h, -?       --help               print help, then exit
  -G           --no-gc              do not collect garbage between iterations
  -g           --gc                 collect garbage between iterations
  -I CI        --ci=CI              bootstrap confidence interval
  -l           --list               print only a list of benchmark names
  -o FILENAME  --output=FILENAME    report file to write to
  -q           --quiet              print less output
               --resamples=N        number of bootstrap resamples to perform
  -s N         --samples=N          number of samples to collect
  -t …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-criterion

6
推荐指数
1
解决办法
886
查看次数

Haskell基准测试/非严格减少的nf/whnf的优化

我正在尝试优化一个旨在获取大型数据集然后对其应用不同操作的库.既然库正在运行,我想优化它.

我的印象是非严格评估允许GHC组合操作,以便在编写所有函数时只迭代一次数据,以便对参数进行排序以便于减少.(并且可能减少对每个数据执行的操作数)

为了测试这个,我编写了以下代码:

import Criterion.Main

main = defaultMain
       [ bench "warmup (whnf)" $ whnf putStrLn "HelloWorld",
         bench "single (whnf)" $ whnf single [1..10000000],
         bench "single (nf)"   $ nf   single [1..10000000],
         bench "double (whnf)" $ whnf double [1..10000000],
         bench "double (nf)"   $ nf   double [1..10000000]]

single :: [Int] -> [Int]
single lst = fmap (* 2) lst

double :: [Int] -> [Int]             
double lst =  fmap (* 3) $ fmap (* 2) lst
Run Code Online (Sandbox Code Playgroud)

使用Criterion库进行基准测试我得到以下结果:

benchmarking warmup (whnf)
mean: 13.72408 ns, lb …
Run Code Online (Sandbox Code Playgroud)

optimization benchmarking haskell haskell-criterion

5
推荐指数
1
解决办法
294
查看次数

如何使用堆叠凳?

只是尝试在我已从 cabal 转换为 stack 的项目上运行基准测试。运行stack bench只是打印出来project-name-version: benchmarks,没有进一步的输出。我是否必须向堆栈传递额外的标志才能查看标准输出?

参考基准部分:

benchmark mainbench
  type:             exitcode-stdio-1.0
  hs-source-dirs:   src, bench
  main-is:          MainBench.hs
  build-depends:    base,
                    vector,
                    linear,
                    hmatrix,
                    hmatrix-gsl,
                    criterion,
                    random,
                    MonadRandom
  ghc-options:      -Wall
                    -O2
  default-language: Haskell2010
Run Code Online (Sandbox Code Playgroud)

编辑:此功能已开启stack-0.1.6.0

(这与如何使用堆栈工作台没有重复:))

haskell haskell-criterion haskell-stack

5
推荐指数
1
解决办法
2651
查看次数

如何将条件与堆栈一起使用

我设置了一个简单的堆栈项目和一个用于基准测试的 .cabal 条目:

benchmark leaves-of-a-tree-bench
  type:             exitcode-stdio-1.0
  hs-source-dirs:   src, bench
  main-is:          MainBenchmarkSuite.hs
  build-depends:    base
                  , criterion
                  , random
                  , leaves-of-a-tree
  ghc-options:      -Wall
                    -O2
  default-language: Haskell2010                    
Run Code Online (Sandbox Code Playgroud)

但是运行后stack bench我收到以下错误:

setup-Simple-Cabal-1.22.5.0-ghc-7.10.3: Error: Could not find benchmark program      
".stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/leaves-of-a-tree-bench/leaves-of-a-tree-bench".
Did you build the package first?
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

编辑:我将项目上传到github 存储库

haskell cabal haskell-criterion haskell-stack

5
推荐指数
1
解决办法
1106
查看次数

水库采样的性能与获取列表的长度和挑选随机元素的关系

我写了两个函数来从未知长度的列表中选择一个随机元素.第一个使用储层采样(具有大小为1的储层),第二个使用列表的长度来选择随机索引并将其返回.出于某种原因,前者要快得多.

第一个函数使用单个遍历并以概率(1/i)选择每个元素,其中i是列表中元素的索引.它导致挑选每个元素的概率相等.

pickRandom :: [a] -> IO a
pickRandom [] = error "List is empty"
pickRandom (x:xs) = do
  stdgen <- newStdGen
  return (pickRandom' xs x 1 stdgen)

-- Pick a random number using reservoir sampling
pickRandom' :: (RandomGen g) => [a] -> a -> Int -> g -> a
pickRandom' [] xi _ _ = xi
pickRandom' (x:xs) xi n gen =
  let (rand, gen') = randomR (0, n) gen in
  if (rand == 0) then
    pickRandom' xs x …
Run Code Online (Sandbox Code Playgroud)

performance haskell haskell-criterion

4
推荐指数
1
解决办法
237
查看次数

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

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

main = defaultMain
  [ bench "the first" $ do
      initTheFirst
      theFirst
      cleanUpTheFirst
  , bench "the second" $ do
      initTheSecond
      theSecond
      cleanUpTheSecond
  ]
Run Code Online (Sandbox Code Playgroud)

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

ADDED:代码使用全局状态(实际上是mongodb),所以我不能同时准备两个初始状态.

haskell haskell-criterion

4
推荐指数
1
解决办法
282
查看次数

Cabal 安装标准内存不足

我正在一个具有 768MB 内存和 512 MB 交换空间的容器上运行。我不能增加这两个。cabal install criterion总是给

Failed during the building phase.
The exception was: ExitFailure (-9)
This may be due to an out-of-memory condition.
Run Code Online (Sandbox Code Playgroud)

期间Compiling Criterion.Types。有什么办法可以解决这个问题,还是我必须不加标准地凑合?

memory installation haskell cabal haskell-criterion

3
推荐指数
1
解决办法
486
查看次数

为什么功能设计上的微小改变就能从根本上改变标准基准的结果?

我有两个源文件,它们的作用大致相同。唯一的区别是,在第一种情况下,函数作为参数传递,而在第二种情况下,函数作为参数传递。

\n

第一种情况:

\n
module Main where\n\nimport Data.Vector.Unboxed as UB\nimport qualified Data.Vector as V\n\nimport Criterion.Main\n\nregularVectorGenerator :: (Int -> t) -> V.Vector t\nregularVectorGenerator = V.generate 99999\n\nunboxedVectorGenerator :: Unbox t => (Int -> t) -> UB.Vector t\nunboxedVectorGenerator = UB.generate 99999\n\nmain :: IO ()\nmain = defaultMain\n    [\n        bench "boxed"   $ whnf regularVectorGenerator (+2137)\n      , bench "unboxed" $ whnf unboxedVectorGenerator (+2137)\n    ]\n
Run Code Online (Sandbox Code Playgroud)\n

第二种情况:

\n
module Main where\n\nimport Data.Vector.Unboxed as UB\nimport qualified Data.Vector as V\n\nimport Criterion.Main\n\nregularVectorGenerator :: Int -> V.Vector Int\nregularVectorGenerator = flip V.generate …
Run Code Online (Sandbox Code Playgroud)

benchmarking haskell haskell-criterion

3
推荐指数
1
解决办法
128
查看次数