关于ghc:哪些技术对Haskell的性能提升贡献最大?

Which techniques have contributed the most to Haskell's improving performance?

上世纪90年代末,我在大学里学了一点哈斯凯尔语。当时,尽管我的表现足够好,而且比人们想象中的高级语言要好得多,但我仍然没有什么好写的。

事情变了。Haskell(GHC)今天有很大的性能,通常不远于C/C++。那么,在编译器中到底发生了什么变化,对这个改进贡献最大?我知道常用的几种技术,例如更好的拆箱和严格的分析。我想对这些技术中的每一种对整体性能改进所带来的定量贡献有一些粗略的了解。

如果你愿意的话,这个问题也可以用以下术语来界定:考虑一下90年代中期GHC Haskell表现不佳的情况。为使业绩更接近2013年GHC Haskell,需要改进的前5个领域是什么?


rough idea about the quantitative contribution that each of these techniques

这个问题的问题在于,在这个细节层次上,它本质上是无法回答的。

15年来,从用户代码和习惯用法到库、编译器优化、代码生成和运行时,软件栈的所有方面都得到了改进。几年来,性能一直是十几个开发人员关注的焦点。

因此,我们已经进行了数千次的更改,最终从GHC获得了今天的业绩。没有简单的列表。

这是一个快速的列表,表明这个问题有多广泛和无法回答。

编译器优化

经过改进的编译器优化使每个组件的整体性能提高了1%到15%。

  • 例如指针标记(14%的改进)
  • 建造师专业化(10%改进)
  • 一个更坚固的入口。

更好的图书馆

改进的库可以对特定领域产生巨大的影响。例如,对于数组和字符串数据,我们现在有:

  • 字节字符串(与列表相比提高了8倍)
  • 矢量
  • 雷帕

通常是列表版本的10倍。

更好的接口

编写快速代码的更好接口

  • 新Primops
  • 更好的数字转换。
  • 具有较低开销的外国金融机构绑定。

更好的工具

更好的性能分析工具

  • GHC核心
  • 螺纹镜
  • 更好的探查器
  • 更好的GC工具

运行时

运行时变得更智能——例如垃圾收集器明显更好

  • GHC并行GC,同样是每个程序的几个百分点。
  • IO线程变得越来越便宜和更快。

代码生成

代码生成器更好。

  • GHC的目标不是生成C,而是将LLVM提高25%,有些提高100%。
  • 本地代码生成器也被重写和改进。

更好的成语

最后,编写快速代码的习惯用法现在被更广泛地理解了。

因此,您可以在软件堆栈中指定任何位置,并且已经进行了百分之几的改进。在运行时、编译器和库设计方面也取得了重大突破。