這不是太難寫一個小哈斯克爾腳本寫入一個巨大的情況下塊和一個小基準它。例如:
module Main (main) where
mapping = zip ['!'..'z'] (reverse ['!'..'z'])
test_code =
[
"module Main where",
"",
"tester :: String -> String",
"tester cs = do",
" c <- cs",
" case transform c of",
" Just c' -> [c']",
" Nothing -> [c ]",
"",
"input = concat [ [' '..'z'] | x <- [1..10000] ]",
"",
"main = print $ length $ tester $ input",
""
]
code1 =
test_code ++
[
"transform :: Char -> Maybe Char",
"transform c = lookup c " ++ show mapping
]
code2 =
test_code ++
[
"transform :: Char -> Maybe Char",
"transform c =",
" case c of"
] ++
map (\(k, v) -> " " ++ show k ++ " -> Just " ++ show v) mapping ++
[
" _ -> Nothing"
]
main = do
writeFile "Test1.hs" (unlines code1)
writeFile "Test2.hs" (unlines code2)
如果你運行這段代碼,它生成的兩個小哈斯克爾源文件:Test1.hs
和Test2.hs
。前者使用Prelude.lookup
將字符映射到字符。後者使用巨大的箱子。這兩個文件都包含將映射應用於大量數據列表並打印出結果大小的代碼。 (這樣可以避免I/O,否則這將是主導因素。)在我的系統上,Test1
需要幾秒鐘的時間才能運行,而Test2
幾乎是瞬間的。
的過興趣的讀者可能想嘗試擴展這個使用Data.Map.lookup
和比較的速度。
這證明了模式匹配遠比鍵/值映射列表...這是不是你問的一個O(n)的遍歷更快。但隨時醞釀你自己的基準。您可以嘗試自動生成一個嵌套的案例,並對結果進行計時。我的猜想是你不會看到太多的差異,但隨時嘗試它。
相關:[*的Haskell GHC:什麼是一個模式匹配的具有N構造的時間複雜度*](http://stackoverflow.com/q/9027384/2751851) – duplode