如何提高HaskellIO的性能?
How to improve the performance of Haskell IO?
看来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 数据写入标准输出):
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的内在问题?
谢谢。
您的示例很慢,因为它使用带有 String
-s 的惰性 IO。两者都有自己的开销。
特别地,String
是一个 Char
-s 的链表,因此它有两个词 space 每个字符的开销(构造函数标签一个词和一个对于前向指针),每个字符至少占用一个单词(一个单词用于缓存的低位字符,三个单词用于未缓存的字符)。
字节或 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
看来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 数据写入标准输出):
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的内在问题?
谢谢。
您的示例很慢,因为它使用带有 String
-s 的惰性 IO。两者都有自己的开销。
特别地,String
是一个 Char
-s 的链表,因此它有两个词 space 每个字符的开销(构造函数标签一个词和一个对于前向指针),每个字符至少占用一个单词(一个单词用于缓存的低位字符,三个单词用于未缓存的字符)。
字节或 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