我無法讓標準作業。我按照教程here,通過執行以下操作安裝Criterion。
cabal update
cabal install -j --disable-tests criterion
當我嘗試ghc -O Fibber.hs或ghc -O --make Fibber收到錯誤時
[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檔案中,就像這樣
library
Exposed-Modules:
Geometry.Sphere
Geometry.Cuboid
Geometry.Cube
但是在這種情況下這樣做并不能解決問題。我也試過這個 SO 解決方案,但無濟于事。我收到基本相同的錯誤:
/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檔案。
name: criterion
version: 1.5.13.0
synopsis: Robust, reliable performance measurement and analysis
license: BSD3
license-file: LICENSE
author: Bryan O'Sullivan <[email protected]>
maintainer: Ryan Scott <[email protected]>
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
uj5u.com熱心網友回復:
一種選擇是使用依賴解決的 REPL。
% cabal repl --build-depends criterion
> :l Fibber.hs
另一個是創建一個 cabal 包。
% 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。另一個是您的代碼將被編譯,而不是解釋;對于性能測驗相當重要,如果您需要標準,這大概就是您正在做的事情!
uj5u.com熱心網友回復:
5分鐘陰謀集團解釋
只是關于如何作業的簡短而不完整的解釋,cabal以便您了解錯誤。
一個專案由組件組成:庫和“runnables”(為解釋起見而命名)。每個組件在標簽下都有自己的一組依賴項。build-depends
庫沒有入口點,因此它們不需要main函式,也不需要指定main-is. cabal 檔案只有一個公共庫,它是包的名稱,在檔案頂部標記為name. 您可以擁有內部庫,但那是另一個主題。在criterion你看到的 cabal 檔案中:
- 是
name(criterion第一行) library標簽下的庫構建配置。(依賴項、暴露的模塊等...)
Runnables 確實需要一個main函式和一個標記為main-is. Runnables 可以是可執行檔案、測驗套件或基準。AFAIK,將可運行檔案標記為其中之一,僅影響通過命令cabal 編譯/安裝cabal build它們的方式: 、、、、cabal run等...例如,cabal test將編譯(默認情況下)庫組件和可執行組件,每個可執行檔案生成一個二進制檔案,但會編譯庫組件和測驗組件,然后運行測驗。理論上,您可以將其用作普通可執行檔案的主要功能(在 cabal 檔案中定義為可執行組件),在這種情況下,cabal 將生成一個獨立的 exe,它將在執行時運行基準測驗。cabal benchcabal buildcabal testCriterion.Main.defaultMain
在criterion的 cabal 檔案中,您可以在可執行檔案和三個測驗套件上看到:
- 檔案夾
criterion-report下命名的可執行檔案app - 測驗套件
sanity,test并cleanup在test每個具有不同主檔案的檔案夾下
這些組件中的每一個都有不同的依賴集,特別是,它們都依賴于criterion 庫,該庫是定義在同一 cabal 檔案中 section 下的組件library,如上所述。
那么我的錯誤是怎么回事?
因此,本質上,您希望該Fibber.hs檔案是“可運行”檔案,既可以作為獨立的二進制檔案,也可以作為專案中的基準套件。因此,您需要根據需要將其添加到 cabal 檔案中。作為建議,請避免將其添加到標準的 cabal 檔案中,否則您將從源代碼編譯標準。按照@DanielWagner 的回答創建一個新專案,其中Fibber.hs是一個主檔案并添加criterion到它的依賴項中,或者使用dependency-repl 替代方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/462821.html
上一篇:如何定義可重疊的依賴實體?
