动态链接是否会损害内联,从而影响GHC的性能?

动态链接是否会损害内联,从而影响GHC的性能?

问题描述:

内联是什么使GHC能够执行的许多复杂优化成为可能。如果我动态地链接一个库(并且得到一个实际的dll/so文件),GHC是否仍然可以内联在它所在的位置,就好像链接是静态的,并且依赖于其余的dll?还是我实际上得到较少的优化?动态链接是否会损害内联,从而影响GHC的性能?

当一个函数被标记为{-# INLINE #-}{-# INLINEABLE #-} -OR如果GHC认为够便宜™ - 整个未重整RHS被包括在接口.hi文件一起编译.o对象。据我所知。

所以不,我敢肯定它不会伤害内联。尽管动态链接会影响代码的局部性,但与您关心的内联方面相比,这是微观优化。

警告:我没有实际做过任何基准测试。

+0

你有什么需要支持的吗?我的意思是,我知道接口文件,但我不知道GHC是否会将它们用于共享库。它会如何?我是否将接口文件的共享库路径+路径提供给可执行文件的编译参数?我一直无法找到关于这件事的很多信息;目前对我来说非常模糊。谢谢您的回答。 – MasterMastic

+0

这是我的头顶,但你可以在[GHC wiki](https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/IfaceFiles)上阅读。 GHC将无法查看任何(除此之外)任何东西(而不是接口文件)。 你可以阅读如何[建立共享对象](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using-shared-libs.html),但我只是让'cabal' [处理它](https://www.haskell.org/cabal/users-guide/installing-packages.html)。 (搜索“共享”。) 你没有提到你为什么要使用共享库。所以为什么? – liyang

+0

哦!你的类型评论对于所有这一切突然产生了很大的意义;你很聪明。那么我想我可以真的相信它会内联,因为它必须有它需要的信息。我现在不想使用共享库来处理任何特定的事情,我只是不想在性能问题时排除它们(例如,即使是从共享库中重复一个小函数的简单循环,也可能会严重叮咬如果内联不在那里)。非常感谢你! – MasterMastic