合理的使用java.util.Vector 一个Vector就是一个java.lang.Object实例的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但是Vector对象在创建后,对象的大小依元素的增加或者删除而定。请看如下代码: Object ob=new Object(); Vector v=new Vector(100000); for(int i=0;i<10000;i++) { v.add(0,obj); } 除非有绝对的理由要求每次将新元素插入到Vector的前面,否则上面代码对性能绝对不利。 默认构造函数中,Vector的初始存储能力是10个元素,如果新元素加入时的存储能力不足,则以后存储能力每次加倍。Vector每次扩展存储能力时,所有的元素都要赋值到新的存储空间中。下面的代码片段要比前面的例子快几个数量级: Object ob=new Object(); Vector v=new Vector(100000); for(int i=0;i<10000;i++) { v.add(obj); } 同样的也使用Vector的remove()方法。由于Vector各个元素之间不能有“空隙”,删除最后一个元素之外的任意其他元素要比删除第一个元素“开销”低好几倍。 假设要从前面的Vector删除所有元素,我们可以使用如下代码: for(int i=0;i<10000;i++) { v.remove(0); } 但是与下面的代码相比,前面的代码要慢几个数量级: for(int i=0;i<10000;i++) { v.remove(v.size()-1); } 当然,删除Vector对象v中所有元素的最好办法是: v.removeAllElements();
当复制大量数据时,使用System.arraycopy()命令
代码重构:增强代码的可读性
不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中所有的构造函数都会被自动调用。但如果一个对象实现了CloneAble接口,我们可以调用它的clone()方法。clone()方法不会调用任何类 函数。
乘法和除法 考虑下面的代码: for(val=0;val<100000;val+=5) { alterX=val*8;myResult=val*2; } 用移位操作替换乘法操作可以极大的提高性能。下面是修改后的代码: for(val=0;val<100000;val+=5) { alterX=val<<3;myResult=val<<1; }
不要将数组声明为:public static final
Array和arrayList的使用 Array([])最高效,但是其容量固定且无法动态改变;ArrayList:容量动态增长,但牺牲效率。 基于效率和类型检验,应尽可能使用array,无法确定数组大小时,才使用ArrayList。 ArrayList是Array的复杂版本,ArrayList内部封装了一个Object类型的数组。从一般意义上来讲,ArrayList和Array没有本质的区别,主要区别就是ArrayList可以动态增容。 尽量使用HashMap和ArrayList除非必要,不推荐HashTable和Vector,后者由于使用同步机制,而导致了性能的开销 StringBuffer和StringBuilder的区别java.lang.StringBuffer是线程安全的可变字符串序列。一个类似String的字符串缓冲区,但不能修改。StringBuilder与其相比,支持所有的操作,但是不同步,所以速度一般比StringBuffer快10%-15%。但是StringBuilder在多线程时容易出现不安全的风险。 除非能确定你的系统瓶颈在StringBuffer上面,并且确定模块不会运行在多线程模式下,否则还是用StringBuffer吧。
常见的优化方案有下列几种: l 优化循环,通过重新组织重复的子表达式来提高循环体的运行性能 l 减少使用对象的数量来提高运行性能 l 缩减网络传输数据来缩短等待时间 采用对象池技术,提高对象的利用效率创建和释放对象会占用相当大的资源,使用对象池可以有效解决创建和释放对象带来的性能损失问题。 例如游戏中敌机的处理方式:一种是游戏在载入关卡时,为每架敌机创建一个对象,随着游戏的行进,安装游戏进程显示不同的敌机,但是这种方案在创建对象时开销巨大,严重影响游戏的运行性能。 另一种方案是在游戏的进程中,根据需要动态的创建相关对象,被击毁时将对象设置为null,但是频繁的创建和释放对象资源会使游戏变得不流畅。 分析游戏需求发现同时显示的敌机最多不超过5架,采用对象池技术先定义一个对象池,容量为显示敌机的最大数量。 Enemy[5] ememy= new Enemy[5] for(int i=0;i<5;i++) { enemy=new Enemy(); } 在类Enemy里面增加标志属性userd和带参数的reset方法使对象可重置到初始状态,在载入游戏的时候初始化对象池,在需要创建对象的时候从对象池获取一个未被使用的对象并使用reset方法初始化,需要初始化对象的时候只用将标志位修改以供下次使用。 尽可能的使用基本数据类型来代替对象对象虽然屏蔽了细节实现,但是是以牺牲存储空间来实现的。使用基本数据类型则仅需要少量的存储空间。虽然对象在业务逻辑的实现上具有优势,但是在绝大部分情况下,使用基本数据类型比使用对象更高效。 用简单的数值计算代替复杂的函数计算 |