所以我从Preventing caching of computation in Criterion benchmark获得了以下代码,我的目标是能够从main
直接进入defaultMain
中的Criterion.Main
函数:
{-# OPTIONS -fno-full-laziness #-}
{-# OPTIONS_GHC -fno-cse #-}
{-# LANGUAGE BangPatterns #-}
module Main where
import Criterion.Main
import Data.List
num :: Int
num = 100000000
lst :: a -> [Int]
lst _ = [1,2..num]
myadd :: Int -> Int -> Int
myadd !x !y = let !result = x + y in
result
mysum = foldl' myadd 0
main :: IO ()
main = defaultMain [
bgroup "summation"
[bench "mysum" $ whnf (mysum . lst) ()]
]
并且cabal文件是:
name: test
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.10
executable test
main-is: Main.hs
build-depends: base >=4.8 && <4.9,
criterion==1.1.0.0
default-language: Haskell2010
ghc-options: "-O3"
(使用ghc 7.10.1和cabal 1.22.0.0)。
如果在cabal repl
内,我尝试在标准中设置断点,我会收到以下错误:
*Main> :break Criterion.Main.defaultMain
cannot set breakpoint on defaultMain: module Criterion.Main is not interpreted
此外,如果我尝试add
包,我会收到以下错误:
*Main> :add *Criterion
<no location info>: module ‘Criterion’ is a package module
Failed, modules loaded: Main.
如果我在目录git clone https://github.com/bos/criterion
内进行
然后将以下两行添加到我的cabal文件中:
other-modules: Criterion
hs-source-dirs: .
./criterion
然后在执行cabal build
时出现以下错误:
criterion/Criterion/IO.hs:23:0:
error: missing binary operator before token "("
#if MIN_VERSION_binary(0, 6, 3)
所以我怀疑我必须完全合并标准集合 上面我的cabal文件文件,感觉有点过分。
我是否有更简单的方法来设置断点 在Criterion中,我可以直接从我的源代码(在cabal repl / ghci中调试时)进入标准的源代码?感谢
P.S。 Debugging IO in a package module inside GHCi有一个相关的问题,但不幸的是它没有帮助。
答案 0 :(得分:1)
这就是我设法实现所需的目标,即能够从我的代码步入(cabal repl
内)到标准来源:
首先:
mkdir /tmp/testCrit
cd /tmp/testCrit
下载criterion-1.1.0.0.tar.gz
解压缩到/tmp/testCrit
,因此我们应该/tmp/testCrit/criterion-1.1.0.0
。在此目录中,我们有Criterion.hs
等。
然后跳转到包含标准源的文件夹并执行:
cd /tmp/testCrit/criterion-1.1.0.0
cabal sandbox init
cabal install -j
请注意,这会创建一个目录:/tmp/testCrit/criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
我们将在稍后使用
返回/tmp/testCrit
创建一个包含上述基准代码的Main.hs
文件以及上面的cabal文件,但将其与/tmp/testCrit/criterion-1.1.0.0
中包含的标准cabal文件合并以下方式。请注意主要的新增内容是:
cc-options: -fPIC
允许用cabal repl
运行它,以及以下内容
专栏:
hs-source-dirs:
./
./criterion-1.1.0.0
./criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
完整的cabal文件应如下所示:
name: test
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.10
executable test
main-is: Main.hs
build-depends:
base >=4.8 && <4.9,
aeson >= 0.8,
ansi-wl-pprint >= 0.6.7.2,
base >= 4.5 && < 5,
binary >= 0.5.1.0,
bytestring >= 0.9 && < 1.0,
cassava >= 0.3.0.0,
containers,
deepseq >= 1.1.0.0,
directory,
filepath,
Glob >= 0.7.2,
hastache >= 0.6.0,
mtl >= 2,
mwc-random >= 0.8.0.3,
optparse-applicative >= 0.11,
parsec >= 3.1.0,
statistics >= 0.13.2.1,
text >= 0.11,
time,
transformers,
transformers-compat >= 0.4,
vector >= 0.7.1,
vector-algorithms >= 0.4
default-language: Haskell2010
ghc-options: "-O3"
c-sources:
./criterion-1.1.0.0/cbits/cycles.c
./criterion-1.1.0.0/cbits/time-posix.c
hs-source-dirs:
./
./criterion-1.1.0.0
./criterion-1.1.0.0/dist/dist-sandbox-782e42f0/build/autogen
cc-options: -fPIC
然后在主目录中执行:
cd /tmp/testCrit/
cabal sandbox init
cabal install -j
然后我们可以启动cabal repl
并直接进入
来自Main.hs
代码 的标准 :
*Main> :break Criterion.Main.defaultMain
Breakpoint 0 activated at criterion-1.1.0.0/Criterion/Main.hs:79:15-43
*Main> main
Stopped at criterion-1.1.0.0/Criterion/Main.hs:79:15-43
_result :: [Benchmark] -> IO () = _
[criterion-1.1.0.0/Criterion/Main.hs:79:15-43] *Main> :step
Stopped at criterion-1.1.0.0/Criterion/Main.hs:(131,1)-(147,39)
_result :: IO () = _
[criterion-1.1.0.0/Criterion/Main.hs:(131,1)-(147,39)] *Main> :step
Stopped at criterion-1.1.0.0/Criterion/Main.hs:(131,29)-(147,39)
_result :: IO () = _
bs :: [Benchmark] = [_]
defCfg :: Criterion.Types.Config = _
[criterion-1.1.0.0/Criterion/Main.hs:(131,29)-(147,39)] *Main> :step
Stopped at criterion-1.1.0.0/Criterion/Main.hs:132:10-37
_result :: IO Criterion.Main.Options.Mode = _
defCfg :: Criterion.Types.Config = _