<1>依赖语言 时间是以复制为单位时间
运算 示例 标准时间
本地赋值 i=n; 1.0
实例赋值 this.i=n; 1.2
int 增值 i++; 1.5
byte 增值 b++; 2.0
short 增值 s++; 2.0
float 增值 f++; 2.0
double 增值 d++; 2.0
空循环 while(true) n++; 2.0
三元表达式 (x<0) ?-x : x 2.2
算术调用 Math.abs(x); 2.5
数组赋值 a[0] = n; 2.7
long 增值 l++; 3.5
方法调用 funct(); 5.9
throw 或catch 异常 try{ throw e; }或catch(e){} 320
同步方法调用 synchMehod(); 570
新建对象 new Object(); 980
新建数组 new int[10]; 3100
<2>特殊情况
1、字串的开销
字串连接运算符+看似简单,但实际需要消耗大量系统资源。
禁止新建一个字串缓冲,可节
省980 单位的对象创建时间(如前所述)
2、同步:
慢10 倍。经JIT 编译器处理后,这一性能 上的 差距提升到50 到100 倍(注意前表总结的时间显示出要慢97 倍)。所以要尽可能避免使用同步方法— —若不能避免, 方法的同步也要比代码块的同步稍快一些。
3、重复利用对象:
要花很长的时间来新建一个对象(根据前表总结的时间,对象的新建时间是赋值时间的 980 倍,而新建一个小数组的时间是赋值时间的3100 倍)。因此,最明智的做法是保存和更新老对象的字 段,而不是创建一个新对象。
4、异常
将小的try----catch块合并到一起。
5、散列处理
价格HashTable(需要造型的以及同步处理)换成HashMap。
6、I/O
应尽可能使用缓冲。
7、使用API 类:
尽量使用来自Java API 的类,因为它们本身已针对机器的性能进行了优化。这是用Java 难 于达到的。比如在复制任意长度的一个数组时,arraryCopy()比使用循环的速度快得多。
8、 其他建议
■将重复的常数计算移至关键循环之外——比如计算固定长度缓冲区的buffer.length。
■static final(静态最终)常数有助于编译器优化程序。
■实现固定长度的循环。
■使用javac 的优化选项:-O。它通过内嵌static,final 以及private 方法,从而优化编译过的代码。注
意类的长度可能会增加(只对JDK 1.1 而言——更早的版本也许不能执行字节查证)。新型的“Just-intime”(
JIT)编译器会动态加速代码。
■尽可能地将计数减至0——这使用了一个特殊的JVM 字节码。