分析多态的成本?

gsp*_*spr 18 polymorphism profiling haskell ghc

我有一个"不必要"多态的代码库,因为几乎每个函数都以某种方式是多态的(为什么不是,什么时候可以?),但最终程序只使用少数具体类型的函数.我已经开始花费一些时间投入SPECIALIZEINLINABLEpragma试图降低所有这些多态性的性能成本,但是随着我的代码的大小,它非常受欢迎.对于每个函数,有没有办法分析在运行时花费多少时间"完成多态性所需的事情"?

(注意:我已经问过这个问题而不知道这样的事情是否在技术上是可行的,或者"多态性需要的东西"是否足够明确).

Don*_*art 8

确定成本的过程是:

  • 构建基准 - 使用标准或其他一些测量工具
  • 配置文件 - 使用ghc的分析支持
  • 如果性能原因不明显,请阅读核心 - 使用ghc-core

通常,您会识别一些操作太慢的操作; 通过分析进行编译并精确确定哪些组件成本高昂,然后检查代码以对其进行优化(例如,通过专门化数据结构或功能,更改算法或进行其他更改).

对于性能关键性工作,您将去检查Core以查看微调编译器是否有帮助.

  • 除了类型类方法之外,多态性确实没有任何代价.相反,存在机会成本,即如果事先已修复,则编译器可以为特定类型生成更好的代码.根据使用的功能,有时设置单态类型并不比多态变体更有效.至于类型类,分析器可能能够提供帮助.如果分析报告指示在类方法中花费了大量时间,您可以考虑将该方法标记为INLINE.但阅读核心可能是您优化此功能的最佳选择. (7认同)
  • 类型类函数添加了一个额外的字典参数,参数化多态函数通过以通用格式(作为闭包)表示数据,生成适用于任何类型对象的代码.只有类型类词典才会显示在探查器中. (4认同)