原则:java处处是对象,但多层对象的方式(如下例代码中a.b.num)比较耗时,如果放到循环中会比较耗时!
下面我们使用一个简单列子来证明我们的结果!我们设置一个两个类A、B,A的数据成员中包含一个B的对象,然后我们使用双层循环来实验,多层对象引用方式和直接对象引用方式的效率。代码例子:
public class AboutDuoJiQianTaoYinYong {
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>int i=0,j=0,k=0,m=0;
<span style="white-space:pre"> </span>A a = new A();
<span style="white-space:pre"> </span>B b = new B();
<span style="white-space:pre"> </span>a.b = b;
<span style="white-space:pre"> </span>int num = 0;
<span style="white-space:pre"> </span>//TimeUtil是用来获得程序段运行时间的类
<span style="white-space:pre"> </span>//程序段一
<span style="white-space:pre"> </span>TimeUtil.beginTiming();
<span style="white-space:pre"> </span>for(i=0;i<9999;i++){
<span style="white-space:pre"> </span>for(j=0;j<99999999;j++){
<span style="white-space:pre"> </span>a.b.num=m;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>TimeUtil.endTiming();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>//程序段二
<span style="white-space:pre"> </span>Integer num = a.b.num;
<span style="white-space:pre"> </span>TimeUtil.beginTiming();
<span style="white-space:pre"> </span>for(i=0;i<9999;i++){
<span style="white-space:pre"> </span>for(j=0;j<99999999;j++){
<span style="white-space:pre"> </span>num=m;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>TimeUtil.endTiming();
<span style="white-space:pre"> </span>}
}
class A{
<span style="white-space:pre"> </span>public B b;
}
class B{
<span style="white-space:pre"> </span>public int num = 0;
}
在我的电脑上两个程序段的耗时如下:
程序段一耗时共:39307ms 0分钟39秒
程序段二耗时共:6ms 0分钟0秒
差距相当大,对不对!所以编程时,还是多多使用局部变量来引用对象,尤其是多层循环时!
除了上面的情况,外还有如下类似情况!
for循环中size(),判断结束
编程时,使用List,map等类时,大家一定遇到过
for(i=0; i<list.size(); i++)
这个会造成小小的时间浪费,使用一个变量size来存储list.size(),会节约时间。当然如果你不喜欢,我有另外一个方案!如下:
for(i=list.size()-1; i>-1;i--)
this也有极小问题
在类内使用关键字“this”会造成时间上的浪费,但是这个浪费很小。以下是程序!
public class This {
public static void main(String[] args) {
Thi thi = new Thi();
/*下面是个函数的耗时分别如下:
当前程序段耗时共:35397ms 0分钟35秒
当前程序段耗时共:35210ms 0分钟35秒
当前程序段耗时共:36939ms 0分钟36秒
当前程序段耗时共:35698ms 0分钟35秒*/
thi.haveThis();
thi.noThis();
thi.haveThis();
thi.noThis();
}
}
class Thi {
public Integer a=null;
public void haveThis(){
int i=0,j=0;
Integer b = new Integer(2);
TimeUtil.beginTiming();
for(i=0; i<999;i++){
for(j=0; j<999999999; j++){
this.a = b;
}
}
TimeUtil.endTiming();
}
public void noThis() {
int i = 0, j = 0;
Integer b = new Integer(2);
TimeUtil.beginTiming();
for (i = 0; i < 999; i++) {
for (j = 0; j<999999999; j++) {
a = b;
}
}
TimeUtil.endTiming();
}
}