原来我以为两种虚拟机的性能差不多,但是最近写了一个小程序测了一下,同样的程序(在1.4下编译的),1.5通常比1.4快10倍以上!!我的小程序开了10个thread,每个thread重复1000次如下操作:
10000次加乘运算,100次内存读写,100次String操作(我把它合称CPU内存运算)
100次文件读写,1次数据库操作(我把它合称IO操作)不同的操作系统和JDK,结果如下windows:
jdk1.4: 耗时1400秒以上
jdk1.5: 耗时500秒左右(主要在IO操作上比1.4明显快几十倍)linux:
jdk1.4:耗时79秒
jdk1.5:耗时73秒(差距不大)HP-UX:
jdk1.4:耗时260秒
jdk1.5:耗时34秒(主要在CPU内存运算上比1.4明显快100倍)请问,有没有朋友遇到过类似的问题,是不是我忽略了什么,有没有除了更新到1.5以外的解决方案?
10000次加乘运算,100次内存读写,100次String操作(我把它合称CPU内存运算)
100次文件读写,1次数据库操作(我把它合称IO操作)不同的操作系统和JDK,结果如下windows:
jdk1.4: 耗时1400秒以上
jdk1.5: 耗时500秒左右(主要在IO操作上比1.4明显快几十倍)linux:
jdk1.4:耗时79秒
jdk1.5:耗时73秒(差距不大)HP-UX:
jdk1.4:耗时260秒
jdk1.5:耗时34秒(主要在CPU内存运算上比1.4明显快100倍)请问,有没有朋友遇到过类似的问题,是不是我忽略了什么,有没有除了更新到1.5以外的解决方案?
另外,在PA_RISC CPU的HP-UX的机器以及IA64 CPU的HP-UX的机器上,差距都很大。
其中HP-UX包括11.11和11.23两种版本,都测过,差距都很大。
FasDBAccess dba=null;
File QueFile;
String PATHNAME="bench_temp";
long begin;
public MyComputerBench(String url,String user,String password){
begin=System.currentTimeMillis();
//数据库连接
String driverClass="oracle.jdbc.driver.OracleDriver";
String poolName="bench";
dba=new MyDBAccess(driverClass,poolName,url,user,password);
//文件
File quedir = new File(PATHNAME);
if (!(quedir.exists())) {
quedir.mkdir();
}
}
public void run(){
long t;
double a;
String str="";
String temp;
System.out.println(""+Thread.currentThread().getName()+" running.");
String id=""+Thread.currentThread().getName()+"_"+System.currentTimeMillis();
QueFile = new File(PATHNAME, "bench_file_test_"+id+".txt");
for(int m=0;m<1000;m++){
//内存CPU
for(int i=0;i<10000;i++){
//整数和浮点运算
a=(double)i+2.0;
a=(double)i*a;
t=i+2;
t=i*t;
}
OcLogger.writeDebugLog("Bench","Finish float/integer computing:"+m);
for(int i=0;i<100;i++){
//内存读写
byte[] arr1=new byte[1000];
byte[] arr2=new byte[1000];
for(int k=0;k<1000;k++){
arr1[k]=arr2[k];
}
}
OcLogger.writeDebugLog("Bench","Finish array read/write:"+m);
for(int i=0;i<100;i++){
//字符串运算
str=""+i+"_"+m+":"+i+"_"+i;
str.split("_");
str.indexOf(""+m);
}
OcLogger.writeDebugLog("Bench","Finish String create:"+m);
// 文件IO
//rt means return char
byte[] rt = new byte[1];
rt[0] = 10;
//write
for(int i=0;i<100;i++){
try{
FileOutputStream fos = new FileOutputStream(QueFile, true);
fos.write(str.getBytes());
fos.write(rt);
fos.flush();
fos.close();
}
catch(Exception ex){
System.out.println("file io:"+ex);
}
}
OcLogger.writeDebugLog("Bench","Finish file I/O:"+m);
// 数据库
for(int i=0;i<1;i++){
try {
temp=dba.select("select DUMMY from dual");
} catch (Exception e) {
System.out.println("db:"+e);
}
}
OcLogger.writeDebugLog("Bench","Finish DB selecting:"+m);
}
long end=System.currentTimeMillis();
long time=(end-begin)/1000;
System.out.println(Thread.currentThread().getName()+" Elapse: "+time+" s.");
} public static void main(String[] args) {
System.out.println("bench begin.");
String url="jdbc:oracle:thin:@127.0.0.1:1521:XXXXXX";
String user="XXXXXX";
String password="XXXXXX";
for(int i=0;i<10;i++){
new Thread(new MyComputerBench(url,user,password)).start();
}
}
}
jdk1.5对线程部分确实有所改进