使用 INLINABLE pragma 的缺点

Posted

技术标签:

【中文标题】使用 INLINABLE pragma 的缺点【英文标题】:Disadvantages of using INLINABLE pragma 【发布时间】:2013-03-15 19:39:22 【问题描述】:

我问这个问题是为了完善 Simon Marlow 对先前关于 INLINABLE 的问题给出的答案,链接在这里:

Is there any reason not to use the INLINABLE pragma for a function?

我意识到这几乎是那个问题的重复,除了 Simon Marlow 没有回答对许多图书馆作者来说最重要的关键问题:从纯粹的性能角度来看是否安全只需将INLINABLE 编译指示添加到所有内容中?

据我所知,唯一的缺点是:

编译时间较慢

更大的接口文件(即*.hi

但我真正想知道的是,添加INLINABLE pragmas 是否会导致代码运行速度变慢?换句话说,INLINABLE pragma 是否会导致 GHC 选择不太理想的优化?

我问的原因是,包括我自己在内的许多库作者并不关心接口文件的大小,并且在添加 INLINABLE 编译指示时我们没有观察到编译速度明显减慢,所以很容易反身到处添加它们,因为这样做似乎没有成本。

相反,忽略它们的代价是,当模块变得非常大时ghc 开始选择性地从接口文件中省略一些函数以节省空间,这有时确实会导致更糟糕的优化,并且很难预测这将发生在哪一点以及它将省略哪些功能。

我个人从未见过由于INLINABLE 注释而导致函数运行速度变慢,但这可能完全是运气造成的。如果在某些情况下INLINABLE 会减慢速度,我想知道为什么会这样,以便我可以更好地推断何时添加编译指示,而不是繁琐地对编译器编译指示的每个排列进行基准测试。

【问题讨论】:

【参考方案1】:

不确定这是否符合纯粹的功能视角,这肯定不是您问题的完整答案,但它是一点点。

从系统管理的角度或观点来看,使一切都可以内联意味着对任何功能的每一个微小变化都会导致接口发生变化,并且你会得到一个新的包 id 并且需要根据这个模块重新编译所有东西。

例如,这会导致发行版出现问题:我们尝试将安全修复程序反向移植到 Debian stable 中的软件包。如果修复没有改变 ABI,我们可以简单地更新一个包(并重建所有静态构建的程序)。如果它确实改变了 ABI,我们可能不得不重建几十个或更多的包。此类问题let Haskell look bad 给那些必须处理这些问题但并不特别关心 Haskell 的人。

【讨论】:

我从没想过。这就引出了第二个问题:如何防止函数的源被导出? @JoachimBreitner:您链接到的讨论非常有趣。考虑到你在那里写的东西,为什么 Debian 不动态链接 Haskell 的东西(到其他 Haskell 的东西——我知道它对 C 库有作用)?顺便说一句,感谢您在 Debian 中维护 Haskell 包的工作,这对我来说意义重大。 很高兴您发现它们很有用;考虑到人们可以使用 cabal-install,我有时不确定拥有它们是否有意义。链接 Haskell dynamical 仍然存在相同的 ABI 问题;不同之处在于它也会影响二进制文件。我们宁愿没有,例如,darcs 可卸载,因为转换器已更新但 mtl 尚未重建。至少现在是这样。

以上是关于使用 INLINABLE pragma 的缺点的主要内容,如果未能解决你的问题,请参考以下文章

库导入:#pragma 注释 VS Visual Studio 项目输入

Android中使用事件总线的优缺点分别是啥?

简述http协议的缺点

Pcb的组织方式优缺点

Django白噪声缺点

LED汽车灯的优缺点