设为首页收藏本站

SKY外语、计算机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6637|回复: 2
打印 上一主题 下一主题

[java基础] Java代码优化技术<二>

[复制链接]

12

主题

5

好友

425

积分

中级会员

Rank: 3Rank: 3

生肖
星座
摩羯座
性别

最佳新人 活跃会员 灌水之王 论坛元老

跳转到指定楼层
楼主
发表于 2012-8-26 20:36:33 |只看该作者 |倒序浏览
    合理的使用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方法初始化,需要初始化对象的时候只用将标志位修改以供下次使用。
   尽可能的使用基本数据类型来代替对象
对象虽然屏蔽了细节实现,但是是以牺牲存储空间来实现的。使用基本数据类型则仅需要少量的存储空间。虽然对象在业务逻辑的实现上具有优势,但是在绝大部分情况下,使用基本数据类型比使用对象更高效。
   用简单的数值计算代替复杂的函数计算
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享淘帖0 收藏收藏0 评分评分

0

主题

0

好友

106

积分

注册会员

Rank: 2

性别
保密
沙发
发表于 2013-3-17 00:30:44 |只看该作者
大神啊  我才来  哈哈  搞毛线
回复

使用道具 评分 举报

2

主题

2

好友

217

积分

中级会员

Rank: 3Rank: 3

性别
保密
板凳
发表于 2013-10-19 16:36:18 |只看该作者
看到了。。。。。。。。。。。
回复

使用道具 评分 举报

您需要登录后才可以回帖 登录 | 立即注册


手机版|SKY外语计算机学习 ( 粤ICP备12031577 )    

GMT+8, 2024-4-19 11:37 , Processed in 0.150620 second(s), 31 queries .

回顶部