似乎Haskell的IO相对较慢。
例如,将Haskell与Python进行比较
#io.py
import sys
s=sys.stdin.read()
sys.stdout.write(s)
,
-- io.hs
main = do
s <- getContents
putStr s
他们的表现(gen.py将512k数据写入stdout):
Python版本:
$ time python gen.py | python io.py > /dev/null
real 0m0.203s
user 0m0.015s
sys 0m0.000s
Haskell版本:
$ time python gen.py | runhaskell io.hs > /dev/null
real 0m0.562s
user 0m0.015s
sys 0m0.000s
似乎Haskell的价格要低得多。我的测试有问题吗?或者它只是Haskell的固有问题?
感谢。
答案 0 :(得分:7)
你的例子很慢,因为它使用了惰性IO和String
- s。两者都有自己的开销。
特别是,String
是Char
- s的链表,因此每个字符有两个空格开销字(构造函数标记为一个字,前向指针为一个字),并且每个字符至少占用一个单词(一个单词用于缓存的低字符,三个单词用于未缓存的字符)。
使用字节或unicode数组输入的严格IO要快得多。尝试对以下内容进行基准测试:
import qualified Data.ByteString as B
main = B.putStr =<< B.getContents
或以下内容:
import qualified Data.Text as T
import qualified Data.Text.IO as T
main = T.putStr =<< T.getContents