跳到主要内容

Julia 内联

阐述

内联一个函数可以减少函数调用的开支,并且增加优化的可能性。但是,内联函数也会导致

  • 运行时开支:增加内存占用、减少内存局域性、减少预测成功概率
  • 编译时开支:更复杂的 IR

在 Julia 中,对函数会评估其内联代价,小于 100 的函数将被内联,否则就不会。

如果要改变默认的内联方式,可以在定义时或者调用时加上 @inline 或者 @noinline 宏。调用时的优先级比定义时的高。

  • @inline:将代价的限制提高了 20 倍
  • @noinline:可以保证不内联

一个例外是:如果调用参数是具体的,则 @inline 一定会内联。这是由于如果调用参数不具体,可以通过具体的运行时类型加上函数屏障来获得更好的性能。可以用下面的方式来检验:

isdispatchtuple(T)

实例

性质

相关内容

参考文献

https://aviatesk.github.io/posts/inlining-101/ https://discourse.julialang.org/t/forcing-inline/20225/5