首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在尝试对haskell进行基准测试时找不到模块“Criterion.Main”

在尝试对haskell进行基准测试时找不到模块“Criterion.Main”
EN

Stack Overflow用户
提问于 2022-04-19 00:33:33
回答 2查看 164关注 0票数 0

我不能让莱恩去工作。我遵循了教程这里,通过执行以下操作来安装标准。

代码语言:javascript
复制
cabal update
cabal install -j --disable-tests criterion

当我尝试ghc -O Fibber.hsghc -O --make Fibber时,我会收到错误

代码语言:javascript
复制
[1 of 1] Compiling Main             ( Fibber.hs, Fibber.o )

Fibber.hs:1:1: error:
    Could not find module ‘Criterion.Main’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
1 | import Criterion.Main
  |

我期望运行测试和诊断,并将其输出到控制台和HTML文件。尝试使用堆栈会导致相同的错误。我以前用我自己的模块解决了这个问题,方法是将它们包括在我的.cabal文件中,如下所示

代码语言:javascript
复制
library
  Exposed-Modules:
    Geometry.Sphere
    Geometry.Cuboid
    Geometry.Cube

但在这种情况下这样做并不能解决问题。我也尝试过这样的解决方案,但没有结果。我基本上收到了同样的错误:

代码语言:javascript
复制
/Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs:3:1: error:
    Could not find module ‘CriterionMain’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
3 | import CriterionMain
  | ^^^^^^^^^^^^^^^^^^^^
Received ExitFailure 1 when running
Raw command: /Users/me/.stack/programs/aarch64-osx/ghc-9.2.2/bin/ghc-9.2.2 -i -i/Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/ -hide-all-packages -fdiagnostics-color=always -packagebase -O2 /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs
Run from: /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/
Standard output:

[1 of 1] Compiling Main             ( /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.hs, /Users/me/Documents/projects/haskell/performance/criterion-1.5.13.0/Criterion/Fibber.o )

这是我的.cabal文件。

代码语言:javascript
复制
name:           criterion
version:        1.5.13.0
synopsis:       Robust, reliable performance measurement and analysis
license:        BSD3
license-file:   LICENSE
author:         Bryan O'Sullivan <bos@serpentine.com>
maintainer:     Ryan Scott <ryan.gl.scott@gmail.com>
copyright:      2009-2016 Bryan O'Sullivan and others
category:       Development, Performance, Testing, Benchmarking
homepage:       http://www.serpentine.com/criterion
bug-reports:    https://github.com/haskell/criterion/issues
build-type:     Simple
cabal-version:  >= 1.10
extra-source-files:
  README.markdown
  changelog.md
  examples/LICENSE
  examples/*.cabal
  examples/*.hs
tested-with:
  GHC==7.4.2,
  GHC==7.6.3,
  GHC==7.8.4,
  GHC==7.10.3,
  GHC==8.0.2,
  GHC==8.2.2,
  GHC==8.4.4,
  GHC==8.6.5,
  GHC==8.8.4,
  GHC==8.10.7,
  GHC==9.0.2,
  GHC==9.2.1

data-files:
  templates/*.css
  templates/*.tpl
  templates/*.js

description:
  This library provides a powerful but simple way to measure software
  performance.  It provides both a framework for executing and
  analysing benchmarks and a set of driver functions that makes it
  easy to build and run benchmarks, and to analyse their results.
  .
  The fastest way to get started is to read the
  <http://www.serpentine.com/criterion/tutorial.html online tutorial>,
  followed by the documentation and examples in the "Criterion.Main"
  module.
  .
  For examples of the kinds of reports that criterion generates, see
  <http://www.serpentine.com/criterion the home page>.

flag fast
  description: compile without optimizations
  default: False
  manual: True

flag embed-data-files
  description: Embed the data files in the binary for a relocatable executable.
               (Warning: This will increase the executable size significantly.)
  default: False
  manual: True

library
  exposed-modules:
    Criterion
    Criterion.Analysis
    Criterion.IO
    Criterion.IO.Printf
    Criterion.Internal
    Criterion.Main
    Criterion.Main.Options
    Criterion.Monad
    Criterion.Report
    Criterion.Types

  other-modules:
    Criterion.Main.Options.Internal
    Criterion.Monad.Internal

  other-modules:
    Paths_criterion

  build-depends:
    -- TODO: Eventually, we should bump the lower version bounds to >=2 so that
    -- we can remove some CPP in Criterion.Report. See #247.
    aeson >= 1 && < 2.1,
    ansi-wl-pprint >= 0.6.7.2,
    base >= 4.5 && < 5,
    base-compat-batteries >= 0.10 && < 0.13,
    binary >= 0.5.1.0,
    binary-orphans >= 1.0.1 && < 1.1,
    bytestring >= 0.9 && < 1.0,
    cassava >= 0.3.0.0,
    code-page,
    containers,
    criterion-measurement >= 0.1.1.0 && < 0.2,
    deepseq >= 1.1.0.0,
    directory,
    exceptions >= 0.8.2 && < 0.11,
    filepath,
    Glob >= 0.7.2,
    microstache >= 1.0.1 && < 1.1,
    js-chart >= 2.9.4 && < 3,
    mtl >= 2,
    mwc-random >= 0.8.0.3,
    -- TODO: Depend on optparse-applicative-0.17 as the minimum (see #258)
    optparse-applicative >= 0.13 && < 0.18,
    parsec >= 3.1.0,
    statistics >= 0.14 && < 0.16,
    text >= 0.11,
    time,
    transformers,
    transformers-compat >= 0.6.4,
    vector >= 0.7.1,
    vector-algorithms >= 0.4
  if impl(ghc < 7.6)
    build-depends:
      ghc-prim
  if !impl(ghc >= 8.0)
    build-depends:
      fail == 4.9.*,
      semigroups

  default-language: Haskell2010
  ghc-options: -Wall -funbox-strict-fields
  if impl(ghc >= 6.8)
    ghc-options: -fwarn-tabs
  if flag(fast)
    ghc-options: -O0
  else
    ghc-options: -O2

  if flag(embed-data-files)
    other-modules: Criterion.EmbeddedData
    build-depends: file-embed < 0.1,
                   template-haskell
    cpp-options: "-DEMBED"

Executable criterion-report
  Default-Language:     Haskell2010
  GHC-Options:          -Wall -rtsopts
  Main-Is:              Report.hs
  Other-Modules:        Options
                        Paths_criterion
  Hs-Source-Dirs:       app

  Build-Depends:
    base,
    base-compat-batteries,
    criterion,
    optparse-applicative >= 0.13

  if impl(ghc < 7.6)
    build-depends:
      ghc-prim

  if !impl(ghc >= 8.0)
    build-depends:
      semigroups

test-suite sanity
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  main-is:              Sanity.hs
  default-language:     Haskell2010
  ghc-options:          -Wall -rtsopts
  if flag(fast)
    ghc-options:        -O0
  else
    ghc-options:        -O2

  build-depends:
    HUnit,
    base,
    bytestring,
    criterion,
    deepseq,
    tasty,
    tasty-hunit

test-suite tests
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  main-is:              Tests.hs
  default-language:     Haskell2010
  other-modules:        Properties

  ghc-options:
    -Wall -threaded     -O0 -rtsopts

  build-depends:
    QuickCheck >= 2.4,
    base,
    base-compat-batteries,
    criterion,
    statistics,
    HUnit,
    tasty,
    tasty-hunit,
    tasty-quickcheck,
    vector,
    aeson

test-suite cleanup
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       tests
  default-language:     Haskell2010
  main-is:              Cleanup.hs

  ghc-options:
    -Wall -threaded     -O0 -rtsopts

  build-depends:
    HUnit,
    base,
    base-compat,
    bytestring,
    criterion,
    deepseq,
    directory,
    tasty,
    tasty-hunit

source-repository head
  type:     git
  location: https://github.com/haskell/criterion.git
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-19 19:14:46

一种选择是使用依赖解决的REPL。

代码语言:javascript
复制
% cabal repl --build-depends criterion
> :l Fibber.hs

另一个是创建一个阴谋集团。

代码语言:javascript
复制
% mkdir Fibber
% mv Fibber.hs Fibber
% cd Fibber
% cabal init
<follow prompts, and say you're building an executable with filename Fibber.hs>
% vi Fibber.cabal
<add criterion to the build-depends: stanza>
% cabal run Fibber # or whatever executable name you gave it in the cabal init step

后者的一个优点是,当您发现其他依赖项时,您可以在一个文件中记录所有这些依赖项,而不必记得每次启动cabal repl时都传递所有这些依赖项。另一个是您的代码将被编译,而不是被解释;对于性能测试非常重要,如果您需要标准,这大概就是您要做的!

票数 1
EN

Stack Overflow用户

发布于 2022-04-20 09:20:12

5分钟卡巴尔解释

只是简单而不完整地解释一下cabal是如何工作的,这样您就可以理解错误了。

一个项目由组件组成:库和"runnables“(为了解释而起的名称)。每个组件在build-depends标记下都有自己的一组依赖项。

库没有入口点,所以它们不需要main函数,也不需要指定main-is。一个阴谋集团文件只有一个公共图书馆,它是包的名称,位于标记为name的文件的顶部。您可以拥有内部库,但这是另一个主题。在criterion的阴谋集团文件中,你可以看到:

  • namecriterion (第一行)
  • 库在library标记下构建配置。(依赖项、公开模块等)

运行程序确实需要一个main函数和一个标记为main-is的模块。Runnable可以是可执行文件、测试套件或基准测试。AFAIK,将可运行的标记为其中之一,只会影响cabal 编译/安装通过命令的方式:cabal buildcabal runcabal testcabal bench等。例如,cabal build将编译(默认情况下)库组件和生成二进制文件的可执行组件,但cabal test将编译库组件和测试组件,然后运行测试。理论上,您可以使用Criterion.Main.defaultMain作为普通可执行文件(定义为阴谋文件中的en可执行组件)的主要函数,在这种情况下,阴谋集团将生成一个独立的exe,它将在执行时运行基准。

criterion的阴谋文件中,您可以看到可执行的测试套件和三个测试套件:

  • 名为criterion-report的可执行文件在app文件夹下
  • 不同主文件的sanitytestcleanuptest文件夹下的测试套件

每个组件都有不同的依赖集,特别是,它们都依赖于criterion库,该库是在library节下的同一个阴谋文件中定义的组件,如前所述。

我的错误到底是怎么回事?

因此,本质上,您希望Fibber.hs文件是一个“可运行的”文件,或者作为一个独立的二进制文件,或者作为一个项目中的基准测试套件。因此,您需要根据自己的喜好将其添加到一个阴谋文件中。作为一项建议,避免将其添加到source的阴谋文件中,否则您将从源代码编译条件。按照@DanielWagner的答案,创建一个新项目,其中Fibber.hs是一个主文件,并将criterion添加到它的依赖项中,或者使用依赖项-repl替代方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71918410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档