所以不得不從Preventing caching of computation in Criterion benchmark下面的代碼和我的目標是能夠從main
直接步入函數defaultMain
在Criterion.Main
:調試/踏入經由小集團REPL一封裝模塊
{-# 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)()]
]
和小集團文件是:
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)
,所以我懷疑是我必須做一個完整的標準小集團 文件上面我的陰謀文件,這感覺有點過分的合併。
是否有更簡單的方法讓我去設置Criterion中的斷點 ,以便我可以直接從我的源代碼步驟(在調試cabal repl/ghci時)進入條件源代碼?謝謝
p.s.在Debugging IO in a package module inside GHCi有一個相關的問題,但不幸的是它沒有幫助。
我不知道答案了'cabal'文件的一部分,但據我所知,GHCi只能*調試其內部字節碼格式的代碼。特別是,您希望避免使用'cabal build'進行本地編譯,因爲默認情況下將使用生成的'.o'文件而不是字節碼。 –
@ØrjanJohansen謝謝,我已經設法通過「合併」cabal文件來調試木薯,這使我能夠無縫地從我的應用程序進入木薯。然而,在製作共享對象時,無法使用具有標準的條件導致「criterion-1.1.0.0/cbits/time-posix.o:relocation R_X86_64_PC32對未定義符號clock_gettime @@ GLIBC_2.2.5」;使用-fPIC'重新編譯,這正是我目前試圖解決的問題! – artella
@ØrjanJohansen:上面評論中解決'time-posix.o'錯誤的方法似乎是添加選項'cc-options:-fPIC'。因此,目前我可以通過合併cabal文件並在結果cabal文件中添加cc-options:-fPIC來實現所需的行爲。 – artella