我正在构建一个将单词存储到字典中的项目(使用库TableColumn
),当使用-fprof-auto编译时,分析器并没有告诉我大部分的时间花在来自dawg模块的函数和CAF上。
代码(也使用管道,但它非常简单)是:
dawg
使用+ RTS -p运行显示我大部分时间花在insertEntry上(这是正常的):
import Data.DAWG.Static as D
import qualified Data.DAWG.Dynamic as DD
import Conduit
import qualified Data.Conduit.Combinators as C
import qualified Data.Text as T
import Data.List (isSuffixOf)
import Control.Monad
insertEntry dawg word =
DD.insertWith (+) (T.unpack word) 1 dawg
isWhitespace x = x `elem` [' ', '.', '\n', '\'']
appendFileToDDAWG dawg fp =
C.sourceFile fp $= C.decodeUtf8
$= C.splitOnUnboundedE isWhitespace
$$ C.foldl insertEntry dawg
loadDirToDAWG :: FilePath -> IO (DAWG Char () Int)
loadDirToDAWG dir = runResourceT $ do
d <- C.sourceDirectoryDeep True dir
$= C.filter (".txt" `isSuffixOf`)
$$ C.foldM appendFileToDDAWG DD.empty
return $ D.freeze d
main = do d <- loadDirToDAWG some_directory
mapM_ print $ D.assocs d
但它并没有告诉我时间实际上花在了COST CENTRE MODULE no. entries %time %alloc %time %alloc
MAIN MAIN 211 0 0.0 0.0 100.0 100.0
main Main 423 0 2.3 1.7 99.9 100.0
loadDirToDAWG Mymodule.BuildDAWG 425 0 1.9 1.0 97.6 98.2
appendFileToDDAWG Mymodule.BuildDAWG 427 74 8.0 5.1 95.7 97.2
insertEntry Mymodule.BuildDAWG 430 71366 86.5 92.1 86.5 92.1
[...]
CAF Data.DAWG.Static 418 0 0.1 0.0 0.1 0.0
CAF Data.DAWG.Trans.Map 412 0 0.0 0.0 0.0 0.0
模块中。这很奇怪,因为它显示了Data.DAWG.Dynamic
模块,因此它能够“检测”#34;来自dawg的一些模块,但不是所有模块,尤其不是完成大部分工作的模块。
下载dawg后,修改其.cabal文件,使其编译为Data.DAWG.Static
,并重建所有内容,我得到一个更大的探查器输出,显示-fprof-auto-top
的所有内部函数,似乎没问题。但是我不想要完整的细节(我没有分析dawg,只是我的代码)而我只是想确保花费时间花在dawg而不是代码中(或者它意味着我的代码)代码有问题。)
那么为什么在第一种情况下Data.DAWG.Dynamic
模块没有显示?
关于GHC如何处理分析,我有什么遗漏吗?