原来我以为两种虚拟机的性能差不多,但是最近写了一个小程序测了一下,同样的程序(在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以外的解决方案?

解决方案 »

  1.   

    不了解,不会吧,真有这么大差距,我明天就用JDK1.5.
      

  2.   

    最新测试结果,在windows vista下,jdk1.4和1.5差距不大
      

  3.   

    在windows vista下,jdk1.4和1.5差距不大,都是250秒左右。
    另外,在PA_RISC CPU的HP-UX的机器以及IA64 CPU的HP-UX的机器上,差距都很大。
    其中HP-UX包括11.11和11.23两种版本,都测过,差距都很大。
      

  4.   

    这是我的测试程序的源码:public class MyComputerBench implements Runnable{
        
        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();
            }
            
        }
    }
      

  5.   

    也不一定
    jdk1.5对线程部分确实有所改进