【问题标题】:How to improve the performance of Haskell IO?如何提高 Haskell IO 的性能?
【发布时间】:2015-06-13 09:16:58
【问题描述】:

好像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 的固有问题?

谢谢。

【问题讨论】:

  • 这两个时间都包括编译程序所花费的时间尝试计时gen.pyc(预编译)与来自io.hs的预编译二进制文件。

标签: haskell io


【解决方案1】:

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

特别是StringChar-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

【讨论】:

  • 两个版本都花费了大约 520 毫秒(大约 10% 的改进)。而且我认为懒惰的IO因其释放资源的方式而被弃用? stackoverflow.com/questions/5892653/whats-so-bad-about-lazy-i-o
  • 尝试使用 -O2 编译。
  • runhaskell 总是很慢,不管是什么工作。 GHC 优化可执行文件,而不是解释器速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2011-02-28
  • 2012-06-30
相关资源
最近更新 更多