2013-08-29 32 views
4

當我測試我的java程序時,發現循環中的第一次運行需要更多時間,以便運行更晚的時間。如何減少循環所需的時間?

每個循環的任務是製作5張相同圖像的縮略圖並將它們存儲在一個zip文件中。我正在使用zip4j和thumbnailator。所有的運行都有相同的代碼。

public static void main(String[] args) throws IOException { 
    try { 
     for(int i=0;i<10;i++){ 
      long start = System.currentTimeMillis(); 
      ZipFile zipFile = new ZipFile(System.nanoTime()+".zip"); 
      ZipParameters parameters = new ZipParameters(); 
      parameters.setCompressionMethod(Zip4jConstants.COMP_STORE); 
      parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_FASTEST); 
      parameters.setIncludeRootFolder(false); 
      ArrayList<File> files = new ArrayList<File>(); 
      for(int j=1;j<5;j++){ 
       files.add(new File("C:\\savedFile2\\1.jpg")); 
      } 
      zipFile.createZipFile(files, parameters); 


      File zippedFile = zipFile.getFile(); 
      byte[] buffer = new byte[(int)zippedFile.length()]; 
      FileInputStream fis = new FileInputStream(zippedFile); 
      fis.read(buffer); 
      fis.close(); 
      zippedFile.delete(); 
      System.out.println("Time taken for "+(i+1)+"th run: "+(System.currentTimeMillis() - start)); 
     } 
    } catch (ZipException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
} 

這是我的代碼。

Time taken for 1th run: 58 
Time taken for 2th run: 24 
Time taken for 3th run: 24 
Time taken for 4th run: 24 
Time taken for 5th run: 25 
Time taken for 6th run: 24 
Time taken for 7th run: 25 
Time taken for 8th run: 25 
Time taken for 9th run: 25 
Time taken for 10th run: 29 

正如你可以從上面的結果可以看出,從環第一次運行所花費的時間作爲休息的兩倍。

這裏發生了什麼?我怎樣才能縮短第一次運行的時間?

+7

這可能是由於該JVM開始程序 – sanbhat

+6

這是因爲之前花費開銷[預熱](HTTP://計算器.com/questions/1481853/technique-or-utility-to-minimize-java-warm-up-time) – rocketboy

+0

這是因爲類必須加載。嘗試命令行java-vm的'verbose'選項。 – Claude

回答

1

我不認爲這與循環有關,而是與createZipFile()函數有關,該函數似乎在第一次調用時會執行一些初始化/加載。 考慮一個在環的製造相同的運行時間如下變形例:

public static void main(String[] args) throws IOException { 
    try { 
     long _start = System.currentTimeMillis(); 
     ZipFile _zipFile = new ZipFile(System.nanoTime()+".zip"); 
     ZipParameters _parameters = new ZipParameters(); 
     _parameters.setCompressionMethod(Zip4jConstants.COMP_STORE); 
     _parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_FASTEST); 
     _parameters.setIncludeRootFolder(false); 
     ArrayList<File> _files = new ArrayList<File>(); 
     for(int j=1;j<5;j++){ 
      _files.add(new File("1.jpg")); 
     }    
      System.out.println("Initializing files: "+(System.currentTimeMillis() - _start)); 
     _zipFile.createZipFile(_files, _parameters); 
      System.out.println("Initial run: "+(System.currentTimeMillis() - _start)); 
     for(int i=0;i<10;i++){ 
      long start = System.currentTimeMillis(); 
      ZipFile zipFile = new ZipFile(System.nanoTime()+".zip"); 
      ZipParameters parameters = new ZipParameters(); 
      parameters.setCompressionMethod(Zip4jConstants.COMP_STORE); 
      parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_FASTEST); 
      parameters.setIncludeRootFolder(false); 
      ArrayList<File> files = new ArrayList<File>(); 
      for(int j=1;j<5;j++){ 
       files.add(new File("1.jpg")); 
      } 
      zipFile.createZipFile(files, parameters); 


      File zippedFile = zipFile.getFile(); 
      byte[] buffer = new byte[(int)zippedFile.length()]; 
      FileInputStream fis = new FileInputStream(zippedFile); 
      fis.read(buffer); 
      fis.close(); 
      zippedFile.delete(); 
       System.out.println("Time taken for "+(i+1)+"tenter code hereh run: "+(System.currentTimeMillis() - start)); 
     } 
    } catch (ZipException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
} 
+0

似乎你的答案是正確的。正如上面的評論者所說,這似乎是預熱和JVM開銷所花費的額外時間。 –