Java优化中的时间换空间
由于系统资源是有限的,为了在有限的资源内,达成某些特定的性能目标,就需要使用时间换空间或者空间换时间的方法。
时间换空间通常用于嵌入式设备,或者内存、硬盘空间不足的情况。通过使用牺牲CPU的方式,获得原本需要更多内存或者硬盘空间才能完成的工作。
下例是一个非常简单的时间换空间的算法,实现了a、b两个变量的值交换。交换两个变量最常用的方法是使用一个中间变量,而引入额外的变量意味着要使用更多的空间。采用下面的方法,则可以免去中间变量,而达到变量交换的目的,其代价则是引入了更多的CPU运算。
aa=a+b;
b=a-b;
aa=a-b;
另一个较为有用的例子是对无符号整数的支持。在Java语言中,不支持无符号整数,这意味着当需要无符号的byte时,需要使用short代替,这也意味着空间的浪费。下例使用位运算模拟无符号byte.虽然在取值和设值过程中,需要更多的CPU运算,但是,却可以大大降低对内存空间的需求。
注意:性能优化的关键在于掌握各部分组件的性能平衡点。如果系统CPU资源有空闲,但是内存使用紧张,便可以考虑使用时间换空间的策略,达到整体性能的改良。反之,CPU资源紧张,内存资源有空闲,则可以使用空间换时间的策略,提升整体性能。(总之,优化可能是决定一款软件成功与否的关键,节选自《Java程序性能优化–让你的Java程序更快、更稳定》)
Java优化中的空间换时间
与时间换空间的方法相反,空间换时间则是尝试使用更多的内存或者磁盘空间换取CPU资源或者网络资源等,通过增加系统的内存消耗,来加快程序的运行速度。
这种方法的典型应用就是缓存。缓存是一块额外的系统内存区,如果没有缓存,程序依然可以正常工作。但是,在一般情况下,缓存中总是保存那些来之不易的数据,重新取得这些数据会花费大量的资源和时间。而通过缓存这块额外的内存,避免了频繁的资源消耗,加快了程序的运行速度。
空间换时间是一种软件设计思路,除了缓存外,在一些算法中,也可以使用这样的技术。以下代码是典型的空间换时间排序方法:
public class SpaceSort {
public static int arrayLen = 1000000;
public static void main(String[] args) {
int[] a = new int[arrayLen];
int[] old = new int[arrayLen];
Map<Integer, Object> map = new HashMap<Integer, Object>();
int count = 0;
while (count < a.length) { //初始化数组数据
int value = (int) (Math.random() * arrayLen * 10) + 1;
if (map.get(value) == null) {
map.put(value, value);
a[count] = value;
count++;
}
}
System.arraycopy(a, 0, old, 0, a.length); //这里只是为了保存原有数组
long start = System.currentTimeMillis();
Arrays.sort(a);
System.out.println(”Arrays.sort spend:”+ (System.currentTimeMillis() – start) + ” ms”);
System.arraycopy(old, 0, a, 0, old.length); //恢复原有数据
start = System.currentTimeMillis();
spaceToTime(a);
System.out.println(”spaceToTime spend:”+ (System.currentTimeMillis()
- start) + ” ms”);
}