内联
许多优化手段都试图消除机器级跳转指令(例如 , x86架构的JMP指令) 。跳转指令会修改指令指针寄存器 , 因此而改变了执行流程 。相比于其他汇编指令 , 跳转指令是一个代价高昂的指令 , 这也是为什么大多数优化手段会试图减少甚至是消除跳转指令 。内联是一种家喻户晓而且好评如潮的优化手段 , 这是因为跳转指令代价高昂 , 而内联技术可以将经常调用的、具有不容入口地址的小方法整合到调用方法中 。Listing 3到Listing 5中的Java代码展示了使用内联的用法 。
Listing 3. Caller method
int whenToEvaluateZing(int y) { return daysLeft(y) + daysLeft(0) + daysLeft(y+1);}
Listing 4. Called method
int daysLeft(int x){ if (x == 0) return 0; else return x - 1;}
Listing 5. Inlined method
int whenToEvaluateZing(int y){ int temp = 0;if(y == 0) temp += 0; else temp += y - 1; if(0 == 0) temp += 0; else temp += 0 - 1; if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;return temp; }在Listing 3到Listing 5的代码中 , 展示了将调用3次小方法进行内联的示例 , 这里我们认为使用内联比跳转有更多的优势 。
如果被内联的方法本身就很少被调用的话 , 那么使用内联也没什么意义 , 但是对频繁调用的“热点”方法进行内联在性能上会有很大的提升 。此外 , 经过内联处理后 , 就可以对内联后的代码进行进一步的优化 , 正如Listing 6中所展示的那样 。
Listing 6. After inlining, more optimizations can be applied
int whenToEvaluateZing(int y){ if(y == 0) return y; else if (y == -1) return y - 1; else return y + y - 1;}循环优化
当涉及到需要减少执行循环时的性能损耗时 , 循环优化起着举足轻重的作用 。执行循环时的性能损耗包括代价高昂的跳转操作 , 大量的条件检查 , 和未经优化的指令流水线(即引起CPU空操作或额外周期的指令序列)等 。循环优化可以分为很多种 , 在各种优化手段中占有重要比重 。其中值得注意的包括以下几种:
- 「干货」告诉你Pr的预览和渲染到底吃什么配置,如何提升性能
- 锐龙R5 3600 vs i5-9400F游戏性能评测:究竟谁是弟弟?
- 荣耀v30跟v30pro处理器一样,但是性能差距很大,这是为什么呢?
- oppofindx2pro这台手机性能如何?
- VIVO?z5x手机的耐用性能怎么样?
- 被误解的iPhone xsMAX防水性能,抗水不等于防水,进水后没有保修
- 怎么看显卡性能
- 「干货」告诉你Pr的预览和渲染到底吃什么配置,如何提升性能
- 红米k30pro对比小米10pro拍照性能如何?
- 最高性能芯片来袭!华为今日推出7纳米鲲鹏920芯片