如何提高Haskell IO的性能?

sqd*_*sqd 7 io haskell

似乎Haskell的IO相对较慢.

例如,将Haskell与Python进行比较

#io.py
import sys
s=sys.stdin.read()
sys.stdout.write(s)
Run Code Online (Sandbox Code Playgroud)

,

-- io.hs
main = do
    s <- getContents
    putStr s
Run Code Online (Sandbox Code Playgroud)

他们的表现(gen.py将512k数据写入stdout):

Python版本:

$ time python gen.py | python io.py > /dev/null

real    0m0.203s
user    0m0.015s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

Haskell版本:

$ time python gen.py | runhaskell io.hs > /dev/null

real    0m0.562s
user    0m0.015s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

似乎Haskell的价格要低得多.我的测试有问题吗?或者它只是Haskell的固有问题?

谢谢.

And*_*ács 7

您的示例很慢,因为它使用了带String-s的惰性IO .两者都有自己的开销.

特别是,String是一个Char-s 的链表,因此每个字符有两个空格开销字(构造函数标记一个字,前向指针一个字),每个字符占用至少一个字(一个字为缓存的低字符,未缓存字符的三个单词).

使用字节或unicode数组输入的严格IO要快得多.尝试基准以下内容:

import qualified Data.ByteString as B

main = B.putStr =<< B.getContents
Run Code Online (Sandbox Code Playgroud)

或者以下内容:

import qualified Data.Text as T
import qualified Data.Text.IO as T

main = T.putStr =<< T.getContents
Run Code Online (Sandbox Code Playgroud)

  • 无论工作是什么,`runhaskell`总是很慢.GHC优化可执行文件,而不是解释器速度. (9认同)