2012-05-04 77 views
1

我在windows下通過eclipse運行代碼,然後在Unix中以獨立java運行。運行相同Java代碼時的性能差異Windows vs Unix

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.ObjectInputStream; 
import java.sql.SQLException; 
import java.text.ParseException; 

public class readObjectBoeing { 



/** 
* @param args 
* @throws ParseException 
* @throws SQLException 
*/ 
public static void main(String[] args) { 
    //File file = new File("/opt/app/d1ebp1m1/dv01/Vibhor/test/00017741_repository.dat"); 
    File file = new File("C:/_Vibhor/00017741_repository.dat"); 
    InputStream is; 
    try { 
     is = new FileInputStream(file); 
     byte[] b = toByteArray(is);//read from file; 
     Object o1 =null; 
     o1 = convertByteArrayToObject(b); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
public static Object convertByteArrayToObject(byte[] buf) throws Exception 
{ 

    if (buf.length == 0) 
    { 
     return null; 
    } 
    long startTime = -1; 
    long step1=-1,step2=-1; 
    Object     obj = null; 
    ByteArrayInputStream bis = null; 
    ObjectInputStream  in = null; 
    try 
    { 
     bis = new ByteArrayInputStream(buf); 
     in = new ObjectInputStream(bis); 
     startTime = System.currentTimeMillis()/1000; 
     obj = in.readObject(); 
     step1 = System.currentTimeMillis()/1000 - startTime ; 
     System.out.println("in.readObject()!! : " + step1); 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 
    finally 
    { 
     if (in != null) 
     { 
      in.close(); 
     } 
     if (bis != null) 
     { 
      bis.close(); 
     } 
     in = null; 
     bis = null; 
    } 

    return obj; 
} 
public static byte[] toByteArray(InputStream input) throws IOException 
{ 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    long count = 0L; 
    byte[] buffer =new byte[4096]; 
    for(int n = 0; -1 != (n = input.read(buffer));){ 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return output.toByteArray(); 
} 

} 

00017741_repository.dat - 它是57Mb文件。
在窗口obj = in.readObject(); - 這需要我4-5秒。
但在Unix obj = in.readObject();它需要我19 - 25秒!

我正在使用VM args -Xmx512m來執行這兩種情況。

在UNIX:

java version "1.6.0_29" 
Java(TM) SE Runtime Environment (build 1.6.0_29-b11) 
Java HotSpot(TM) Server VM (build 20.4-b02, mixed mode) 

在Windows中:

jre 1.6.0_26 

缺少什麼我在這裏?任何改善unix性能的建議?

+1

您是否在控制內存方面?這是一個非常耗費內存的操作,因此JVM堆設置的任何差異都會帶來巨大的差異。順便說一句,除了主要版本之外,顯然不一樣的JDK。 –

+1

計算機是否具有相同的CPU和內存? – shem

+0

當你在windows中從eclipse運行它時,你的虛擬機已經在內存中運行了(它被用於eclipse)。也許JVM需要20秒才能啓動。嘗試多次運行程序(考慮緩存)。 –

回答

0

這裏有兩個可以做具體的事情弄清楚這一個:

  1. 確保Unix上的文件駐留在本地文件系統上,而不是網絡安裝;
  2. 使用一個分析器(例如YourKit)來找出花費的時間。
+0

該文件駐留在本地文件系統中。感謝分析器建議,將嘗試輸出 – user1373671

+0

obj = in.readObject();在unix中需要19秒,在windows中需要5秒。在這裏有一個分析器的幫助? – user1373671

+0

@ user1373671:我認爲在這一點上任何人都不能提供任何保證,但我認爲探查者是您最好的選擇。 – NPE

0

在平臺之間找到這樣的差異並不令人震驚。瞭解,雖然字節碼是相同的JVM是平臺特定的。

有一些類似的區域,其中有一些代碼可以在一個平臺上完美運行,並且在另一個平臺上運行失敗。我碰到的一個案例是拖放文件,其中unix(至少ubuntu)使用不同於windows的數據類型來刪除文件。

您必須對您打算讓您的代碼在

而且運行的所有平臺上測試,在特定情況下,您應該嘗試更有效地從你的InputStream讀取(使用一個byte []),或創建一個的BufferedInputStream來包裝你的FileInputStream在

+0

我實際上是從我的實際應用程序中以字節[]的形式從數據庫中獲取它。 obj = in.readObject();在Unix中需要19秒,而在Windows中需要5秒。 – user1373671

0

您在使用的不同JVM之間也必須有所不同。例如,在* nix系統上,有些廣泛使用的「icedtea」或「OpenJDK」等vms(因爲它們是默認安裝)。

相關問題