`

58龙哥教你“如何做系统性能优化”(纯干货)

    博客分类:
  • java
 
阅读更多
如何做系统性能优化

性能优化的目标是什么?不外乎两个:
时间性能:减小系统执行的时间
空间性能:减小系统占用的空间

一、代码优化
做代码优化前,先了解下硬件Cache:
(1)Cache Level:通常来说L1、L2的Cache集成在CPU里,L3的Cache放在CPU外;
(2)Cache Size:它决定你能把多少东西放到Cache里,有Size就有竞争,就有替换,才有所谓优化的空间;
(3)Cache Type:I-Cache(指令),D-Cache(数据),TLB(MMU的Cache);

代码层次的优化主要从以下两个角度考虑问题:
(1)I-Cache优化:精简code path,简化调用关系,减少冗余代码等等;
(2)D-Cache优化:减少D-Cache的miss数量,增加有效数据访问。

以下是一些技巧,可供参考:
(1)Code adjacency(把相关代码放在一起)
这里有两层含义:一是相关源文件要放在一起;二是相关函数在object文件里面,也应该相邻。
这样,可执行文件被夹在到内存里时,函数位置也是相邻的,同事还符合模块化编程的要求:高内聚,低耦合。
(2)Cache line alignment(cache对齐)
对齐Cache以减少潜在的一次读写,但这可能意味着内存的浪费,需要从空间和时间两方面衡量。
(3)Branch prediction(分支预测)
如果能预测那段代码有更高的执行概率,就能减少跳转次数(调整if和else的顺序?)。
(4)Data prefetch(数据预取)
由CPU自动完成。
(5)Register parameters(寄存器参数)
(6)Lazy computation(延时计算)
最近不用的变量,不要急着去初始化(意味着可能执行复杂的构造),如果某个分支跳出了函数,这些动作就浪费了。
COW(copy-on-write)就是一种延时计算的技术。
(7)Early computation(提前计算)
有些变量,计算一次就够了,任何加减乘除都会消耗CPU指令,尽量使用常数,而不是24*60*60来表示一天的秒数。
(8)Inline(内联函数)
(9)Macro(宏定义)
(10)Allocation on stack(局部变量)
避免在栈上申请大数组,其初始化和销毁的代价很高。
(11)Per-cpu data structure(非共享数据结构)
避免共享量的锁,在thread local里,多核情况下使用局部变量会带来好处。
(12)Reduce call path or call trace(减少函数调用层次)
(13)Read&write split(读写分离)
(14)Recude duplicated code(减少冗余代码)

其中,(1)(6)(7)(8)(9)(10)(11)(12)(14)这些优化方式最为常见。

二、工具优化
“工欲善其事
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics