【发布时间】:2012-12-01 16:07:30
【问题描述】:
众所周知,Haskell 的默认 String 实现在速度和内存方面效率不高。据我所知,[] lists 通常在 Haskell 中作为单链表实现,对于大多数小型/简单数据类型(例如Int),这似乎不是一个好主意,但对于String这似乎完全是矫枉过正。关于此事的一些意见包括:
在像这样的简单基准测试中,即使是用 Python 等解释性语言编写的程序也能胜过使用 String 的 Haskell 代码一个数量级。
Efficient String Implementation in Haskell
由于String只是[Char],即Char的链表,这意味着String的引用局部性较差,再次意味着String在内存中相当大,至少为N *(21bits + Mbits ) 其中 N 是字符串的长度,M 是指针的大小 (...)。字符串不太可能被编译器优化为循环等。
我知道 Haskell 有 ByteStrings(和 Arrays)有几种不错的风格,它们可以很好地完成这项工作,但我希望默认实现是最有效的实现。
TL;DR: 为什么 Haskell 的默认 String 实现是一个单链表,即使它效率极低并且很少用于现实世界的应用程序(除了非常简单的应用程序)?有历史原因吗?是不是更容易实现?
【问题讨论】:
-
我认为这是因为
[Char]非常舒适。 -
我觉得值得一提的是,
ByteString绝对不是文本类型,Array也好不了多少——Text确实是正确的解决方案。 -
Haskell /= GHC。在 Haskell 的早期,当有几个不同的编译器/解释器时,有一个“一路乌龟”的字符串表示是一个值得称道的设计。
-
就我个人而言,我希望默认实现是简单的、有意义的懒惰、如果天真地使用时行为正确,并且对于简单的使用来说“足够快”。
[Char]在这方面做得很好,而ByteString强调不行。 -
我想知道人们是否也抱怨在其他语言中存在
StringBuilder类,默认字符串实现对于重复连接非常低效......
标签: string performance haskell linked-list