今天写一个小程序,其中有这么一段
File d = new File(dir.trim());
if (d == null || !d.exists() || !d.canRead()) {
return false;
}
String path = d.getCanonicalPath();
if (dirLevel == 1) {
String parent = d.getParent();
this.parentPath = (parent == null) ? "" : parent;
}
fileList.add(path);
pathTable.put(path, this.parentPath);
其中,
this.parentPath = (parent == null) ? "" : parent;
这一句,很多人为了省一个变量,写成是
this.parentPath = (d.getParent() == null) ? "" : d.getParent();
虽然看起来,没有什么不对的,但是我总觉得不太好,多调用了一次getParent()方法,在小的程序里和我的写法出入不大,性能也不会出现大的差异,但是如果在一个非常庞大的业务系统里面,很可能就有影响了。于是,我想再写个小程序来验证一下我的想法。
package jcms.util;
import java.io.File;
import java.io.IOException;
public class Testit {
public static void main(String[] args) {
String s = "C:\\windows\\win.ini";
File f = new File(s);
int len = 10;
System.out.println("len=" + len);
try {
String a = "";
String t = "";
long t1 = System.currentTimeMillis();
for (int i = 0; i < len; i++) {
t = "path=" + f.getCanonicalPath() + ",size=" + f.length();
a = t;
}
long t2 = System.currentTimeMillis();
System.out.println(a);
System.out.print("time1=");
System.out.println(t2 - t1);
// ----------------------------------
long t11 = System.currentTimeMillis();
t = "path=" + f.getCanonicalPath() + ",size=" + f.length();
for (int i = 0; i < len; i++) {
a = t;
}
long t12 = System.currentTimeMillis();
System.out.println(a);
System.out.print("time2=");
System.out.println(t12 - t11);
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码如上,程序很简单。分别做len次循环,打印直接在循环里调用方法的时间和在循环外调用方法的时间,然后来个比较。
分别取len=10,100,1000,10000,100000时的样本数据:
len=10
path=C:\WINDOWS\win.ini,size=624
time1=0
path=C:\WINDOWS\win.ini,size=624
time2=0
len=100
path=C:\WINDOWS\win.ini,size=624
time1=20
path=C:\WINDOWS\win.ini,size=624
time2=0
len=1000
path=C:\WINDOWS\win.ini,size=624
time1=100
path=C:\WINDOWS\win.ini,size=624
time2=0
len=10000
path=C:\WINDOWS\win.ini,size=624
time1=411
path=C:\WINDOWS\win.ini,size=624
time2=0
len=100000
path=C:\WINDOWS\win.ini,size=624
time1=3725
path=C:\WINDOWS\win.ini,size=624
time2=0
大家可以看出来,随着len的逐步递增,time1花的时间也越来越长,而time2几乎不变,也就是说调用方法的时间越来越长,程序的性能逐渐下降。
当然,在实际程序中是很少会出现这样的循环的,此处的循环是为了模拟系统的时间消耗的。
程序性能的提高,是有不少学问的。因为性能的问题,很多人大眼一看程序,程序没有错啊,没有问题啊,是的,程序没有问题,但是细节有问题。
比如像电信服务类的,计费类的,银联接口类的,如果程序不严谨,细节性能不注意,试想会出现什么样的后果?
打个电话接通了,1分钟后才能听到对方回音;银行ATM取个钱,按下按钮,5分钟后机器才反应……
程序性能提高,要从点滴积累开始。
呵呵,抛砖引玉了~
File d = new File(dir.trim());
if (d == null || !d.exists() || !d.canRead()) {
return false;
}
String path = d.getCanonicalPath();
if (dirLevel == 1) {
String parent = d.getParent();
this.parentPath = (parent == null) ? "" : parent;
}
fileList.add(path);
pathTable.put(path, this.parentPath);
其中,
this.parentPath = (parent == null) ? "" : parent;
这一句,很多人为了省一个变量,写成是
this.parentPath = (d.getParent() == null) ? "" : d.getParent();
虽然看起来,没有什么不对的,但是我总觉得不太好,多调用了一次getParent()方法,在小的程序里和我的写法出入不大,性能也不会出现大的差异,但是如果在一个非常庞大的业务系统里面,很可能就有影响了。于是,我想再写个小程序来验证一下我的想法。
package jcms.util;
import java.io.File;
import java.io.IOException;
public class Testit {
public static void main(String[] args) {
String s = "C:\\windows\\win.ini";
File f = new File(s);
int len = 10;
System.out.println("len=" + len);
try {
String a = "";
String t = "";
long t1 = System.currentTimeMillis();
for (int i = 0; i < len; i++) {
t = "path=" + f.getCanonicalPath() + ",size=" + f.length();
a = t;
}
long t2 = System.currentTimeMillis();
System.out.println(a);
System.out.print("time1=");
System.out.println(t2 - t1);
// ----------------------------------
long t11 = System.currentTimeMillis();
t = "path=" + f.getCanonicalPath() + ",size=" + f.length();
for (int i = 0; i < len; i++) {
a = t;
}
long t12 = System.currentTimeMillis();
System.out.println(a);
System.out.print("time2=");
System.out.println(t12 - t11);
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码如上,程序很简单。分别做len次循环,打印直接在循环里调用方法的时间和在循环外调用方法的时间,然后来个比较。
分别取len=10,100,1000,10000,100000时的样本数据:
len=10
path=C:\WINDOWS\win.ini,size=624
time1=0
path=C:\WINDOWS\win.ini,size=624
time2=0
len=100
path=C:\WINDOWS\win.ini,size=624
time1=20
path=C:\WINDOWS\win.ini,size=624
time2=0
len=1000
path=C:\WINDOWS\win.ini,size=624
time1=100
path=C:\WINDOWS\win.ini,size=624
time2=0
len=10000
path=C:\WINDOWS\win.ini,size=624
time1=411
path=C:\WINDOWS\win.ini,size=624
time2=0
len=100000
path=C:\WINDOWS\win.ini,size=624
time1=3725
path=C:\WINDOWS\win.ini,size=624
time2=0
大家可以看出来,随着len的逐步递增,time1花的时间也越来越长,而time2几乎不变,也就是说调用方法的时间越来越长,程序的性能逐渐下降。
当然,在实际程序中是很少会出现这样的循环的,此处的循环是为了模拟系统的时间消耗的。
程序性能的提高,是有不少学问的。因为性能的问题,很多人大眼一看程序,程序没有错啊,没有问题啊,是的,程序没有问题,但是细节有问题。
比如像电信服务类的,计费类的,银联接口类的,如果程序不严谨,细节性能不注意,试想会出现什么样的后果?
打个电话接通了,1分钟后才能听到对方回音;银行ATM取个钱,按下按钮,5分钟后机器才反应……
程序性能提高,要从点滴积累开始。
呵呵,抛砖引玉了~