软件构造笔记 8.3 Code Tuning for Performance Optimization
1.代码调优过程和策略
代码调优不是为了修复bug,而是对正确的代码进行修改以提高性能,通常是小规模的变化。
调优不会减少代码行数;应有明确的优化目标;不要边写边调优;不是性能优化的第一选择。
2.代码调整用于对象创建和重用
单例模式:某些类在应用运行期间,只需要一个实例。强制客户只能创建一个Object实例,避免因为new操作带来的时空性能(尤其是GC)的损失,也便于复用。设置静态变量来存储单一实例对象,将构造器设置为private,从而客户无法new,提高静态方法来获取单一实例变量。
轻量模式:考虑文本编辑器的”字符“,同一个字符重复出现多次,代表同样内容,但字体符号不同。
该模式允许在应用中不同部分共享使用objet,降低大量Object带来的时空代价。
内部特征:不管在什么场合使用该Object,内部特征都不变。
外部特征:不是固定的,需要不同场合context分别指派/计算其值。
单例模式不区分各场合下的不同表现形式,统一用一个实例表示。
轻量模式的同一个事物有多种表现形式,更灵活。
原型模式:直接new的时空代价高,所以通过clone而非new来创建
引用拷贝:创建一个指向对象的引用变量的副本。所以我们将有两个引用同一个对象的引用变量。
对象拷贝:创建对象本身的副本。所以我们将有两个引用变量,每个引用变量引用不同的对象。
代价是原本可GC的对象,现在留在pool中,导致内存浪费,相当于用空间换时间。单例和轻量模式本质上都是对象池,但有不同的变化。
规范化:不要保留对象的多个拷贝。仅保留少量的Object。==比equals的效率更高,使用尽可能将Object转化为简单数据类型加以存储和处理。
规避垃圾回收:核心思想是减少创建Object的数量,避免GC的代价。
尽可能的使用简单数据类型,对类的成员变量也是如此;
局部的简单数据类型在stack中存储,GC代价低;
类的简单类型成员变量在GC的时候代价也低,若为Object成员变量则需要GC。
3.字符串的代码调整
字符串常量池:String Constant Pool是Heap中包含字符串对象引用的特殊内存区域。
使用字符串文字:String s =“java”;
在双引号内写入的字符串称为字符串文字;
当我们创建字符串文字时,JVM会检查字符串;
该字符串已经存在于池中,那么它的引用被提取;
如果该字符串不在池中,则会在其中创建一个新的字符串对象。
使用新的关键字:String s = new String(“java”);
当我们使用new关键字创建字符串时,它会转到堆。