こんにちは Stackoverflow コミュニティです。
私はHaskellに比較的慣れていないので、ファイルに大きな文字列を書き込む
writeFile
か、非常にhPutStr
遅いことに気付きました。
1.5 Mb 文字列の場合、私のプログラム (ghc でコンパイル) は約 2 秒かかりますが、c++ の「同じ」コードは約 0.1 秒しかかかりません。文字列は、約 10000 個の要素を持つリストから生成され、 でダンプされwriteFile
ます。また、リストをトラバースしようとしましたがmapM_
、hPutStr
同じ結果が得られました。
大きな文字列をより速く書く方法はありますか?
アップデート
@applicativeが指摘したように、次のコードは2MBのファイルですぐに終了します
main = readFile "input.txt" >>= writeFile "ouput.txt"
だから私の問題はどこかにあるようです。リストを書くための私の2つの実装は次のとおりです(WordIndexとCoordListはMapとListのtypealiasesです)
hPutStrLn で
-- Print to File
indexToFile :: String -> WordIndex -> IO ()
indexToFile filename index =
let
indexList = map (\(k, v) -> entryToString k v) (Map.toList index)
in do
output <- openFile filename WriteMode
mapM_ (\v -> hPutStrLn output v) indexList
hClose output
-- Convert Listelement to String
entryToString :: String -> CoordList -> String
entryToString key value = (embedString 25 key) ++ (coordListToString value) ++ "\n"
writeFile で
-- Print to File
indexToFile :: String -> WordIndex -> IO ()
indexToFile filename index = writeFile filename (indexToString "" index)
-- Index to String
indexToString :: String -> WordIndex -> String
indexToString lead index = Map.foldrWithKey (\k v r -> lead ++ (entryToString k v) ++ r) "" index
ここでスピードアップを見つけるのに少し手伝ってくれるかもしれません。
前もって感謝します