【问题标题】:How to use criterion with stack如何将标准与堆栈一起使用
【发布时间】:2016-09-25 21:56:10
【问题描述】:

我设置了一个简单的堆栈项目,以及一个用于基准测试的 .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                    

但是在运行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?

我错过了什么吗?

编辑:我将项目上传到a github repository

【问题讨论】:

  • 死你试试stack build
  • 你能上传一个有这个问题的完整项目吗? (不相关:通过在 build-depends 中定义 leaves-of-a-tree 并将 src 添加到 hs-source-dirs 您两次依赖于您的库组件)
  • 我确实尝试过stack build。问题是没有找到基准程序。 @Jan 感谢您的评论。我也把相关文件上传到了github。

标签: haskell cabal haskell-stack criterion


【解决方案1】:

这让我想起了当您没有适当的主模块时会发生什么。顶部有“module MainBenchmarkSuite”吗?

我找不到 ghc 票,但出于某种原因,ghc 仅将其视为警告。 IIRC 它已在 GHC 8.0 中解决

【讨论】:

  • 我认为包含基准程序的模块一切正常。但是,可能是我遗漏了一些东西。我添加了一个指向包含该项目的 github 存储库的链接。请注意,我在尝试寻找解决方案时进行了一些重命名。
【解决方案2】:

这里发生了一些奇怪的阴谋集团。

你的LeavesOfATreeBench.hs

-- |

module LeavesOfATreeBench where

import           Criterion.Main
import           Data.BinTree

mkTree :: [a] -> BinTree a
mkTree [] = Nil
mkTree (x:xs) = Fork x (mkTree lxs) (mkTree rxs)
  where (lxs, rxs) = splitAt ((length xs + 1) `div` 2) xs

main :: IO ()
main = defaultMain [
  bgroup "leaves"
    [ bench "tree 0" $ whnf leaves (mkTree ([0 .. 20] :: [Integer]))
    , bench "tree 1" $ whnf leaves (mkTree ([0 .. 200] :: [Integer]))
    ]
  ]

现在,一旦我简单地删除该行

module LeavesOfATreeBench where

一切都按预期进行:

Registering leaves-of-a-tree-0.1.0.0...
leaves-of-a-tree-0.1.0.0: benchmarks
Running 1 benchmarks...
Benchmark leaves-of-a-tree-bench: RUNNING...
benchmarking leaves/tree 0
time                 41.81 ns   (41.51 ns .. 42.29 ns)
                     0.999 R²   (0.998 R² .. 0.999 R²)
mean                 42.65 ns   (42.12 ns .. 43.50 ns)
std dev              2.293 ns   (1.526 ns .. 3.690 ns)
variance introduced by outliers: 75% (severely inflated)

benchmarking leaves/tree 1
time                 71.11 ns   (70.41 ns .. 71.84 ns)
                     0.999 R²   (0.999 R² .. 0.999 R²)
mean                 71.30 ns   (70.45 ns .. 72.19 ns)
std dev              2.917 ns   (2.431 ns .. 3.507 ns)
variance introduced by outliers: 62% (severely inflated)

Benchmark leaves-of-a-tree-bench: FINISH
Completed 2 action(s).

【讨论】:

  • 这似乎是 Cabal 或 Stack 中的错误,不是吗?
  • 由于 Stack 使用 Cabal 库进行大多数构建,我猜这是与 Cabal 相关的。如果它不被认为是一个错误,那么至少文档应该涵盖这一点。
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2018-11-23
  • 2016-12-14
相关资源
最近更新 更多