避免开销大的方法调用所带来的性能提升只不过是内联所能带来的性能提升的一半,而另一半则是调用间优化(cross-call),即内联可能会带来调用间优化。
例如:float x = 90.0; .... float y = sin(x); 如果两者不在一个函数内即存在函数调用,则将被调用函数声明为内联,
则编译会直接将 float y = 1.0;
与避免方法调用相比,调用间代码优化更可能获得巨大的性能提升。内联最终还是编译器做的事
内联的两个法则:
a 够缩减代码大小的内联都是可取的,而任何显著增大代码大小的内联都是不可取的;
b 如果方法的实现是易变的,则不应将其内联
谨记,二级缓存与换页问题是代码膨胀的副产品。内联通常会导致代码膨胀。
内联规则:
a 唯一化:指方法在程序中的调用点是唯一的,即只存在一个点调用该方法。
b 精简化:小型方法,一般包含4条以下的源代码级语句,编译后将形成10条以下的汇编指令。
(不会影响代码大小,通常精简化方法有:访问类方法,间接调用,简单的操作符重载。
精简化方法通常为叶方法,即该方法不调用其他方法,在执行后返回)
总结:
- 直接量参数与内联结合使用(指的就是调用间优化,一些方法内敛后可以直接获取到值,连函数都不用了),为编译器性能的大幅提升开辟了更为广阔的空间。
- 对于高频率的方法,如果静态尺寸较大,而动态尺寸较小(就是需要改动的部分),可以考虑将其重写,从而抽取其核心的动态特性,并将动态组建内联。
- 精简化与唯一化方法总是可以内联的。