gpt4 book ai didi

haskell - 为什么程序在 runghc 或分析中会更快?

转载 作者:行者123 更新时间:2023-12-02 09:56:32 25 4
gpt4 key购买 nike

我有以下程序,它接受大量输入(扩展名/mime 映射列表、文件列表)并逐行输出结果(每个文件的 mime 类型)。

import System.IO
import Control.Monad
import qualified Data.Map as M
import System.FilePath
import Data.Char

main :: IO ()
main = do
input_line <- getLine
let n = read input_line :: Int -- Number of elements which make up the association table.
input_line <- getLine
let q = read input_line :: Int -- Number Q of file names to be analyzed.

mimeMap <- fmap M.fromList $ replicateM n $ do
input_line <- getLine
let input = words input_line
let ext = input!!0 -- file extension
let mt = input!!1 -- MIME type.
return (map toLower ext, mt)

replicateM_ q $ do
fname <- getLine
let ext = map toLower . drop 1 . takeExtension $ fname
mime = M.findWithDefault "UNKNOWN" ext mimeMap
putStrLn mime

该程序非常慢,因此我开始对其进行分析,并得到了一个奇怪的结果。

编译时

ghc --make -O2 coding.hs

程序运行速度非常慢。然而,-fprof-auto 似乎加快了速度。编译为

ghc --make -O2 coding.hs -prof -fprof-auto -fforce-recomp

使其速度极快-prof单独没有效果。

奇怪的是,使用 runghccoding.hs 运行时速度也非常快。

我不知道从那里该往哪个方向走。有谁明白这里发生了什么吗?

编辑:我应该提到我的 ghc 是 7.10.1。

最佳答案

提供问题的完整答案:

正如 Reid Barton 提到的,问题似乎是臭名昭著的状态黑客优化,它将 mimeMap 内联到重复的 IO 操作中,执行次数超出了必要的次数。 -fno-state-hack 禁用该优化并解决问题。解决该问题的另一种方法是强制对“mimeMap”进行严格评估。

!mimeMap <- fmap M.fromList $ replicateM n [...]

但是,似乎还有一个 regression in GHC 7.10 ,其中 -fno-state-hack 没有解决问题。这解释了为什么它没有为我解决这个问题。

非常感谢大家的回答。

关于haskell - 为什么程序在 runghc 或分析中会更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30141515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com