2012-05-18 117 views
0

此代碼應該在文件夾中查找圖像,並將圖像合併到6000x6000圖像中。它正在工作,但它真的很慢。我可以實現的任何優化?有沒有什麼辦法可以讓我優化這個java代碼?

File in = new File(args[1]); 
      File out = new File(args[2]); 
    in.mkdirs(); 
    out.mkdirs(); 
    if(out.exists()) 
    { 
     out.delete(); 
    } 
    if(!in.isDirectory()) 
    { 
     Main.printUsage(); 
    } 


    BufferedImage bout = new BufferedImage(6032, 6032, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g = bout.createGraphics(); 
    int count = 0; 
    long starttime = System.currentTimeMillis(); 
    for(int i=0; i<=376; i++) 
    { 
     for(int k=0; k<=376; k++) 
     { 
      File cu = new File(in, (i-188)+"-"+(k-188)+".png"); 
      if(cu.exists()) 
      { 
       count++; 
       try { 
        g.drawImage(ImageIO.read(cu), 16*i, 16*k, null); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       Runtime.getRuntime().; 
      } 
     } 
    } 
    System.out.println("Processed "+count+" chunks in "+((System.currentTimeMillis()-starttime)/1000F)+" seconds"); 

    g.dispose(); 
    try { 
     ImageIO.write(bout, "png", out); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

其中*部分*緩慢結合對圖像的?時間到了哪裏?簡單地通過時間戳添加日誌記錄可能很好地隔離哪個位是問題。 –

+0

我很抱歉,自編譯以來,我修改了源代碼。什麼都不應該改變 – HansiHE

+1

對於已經工作的代碼的優化,你應該考慮http://codereview.stackexchange.com –

回答

2

延遲可能在文件系統中,打開所有這些文件。將那麼多文件放在一個目錄中,即使只是查找目錄中的時間也不是微不足道的。

如果是這種情況,將不會有軟件解決方案。嘗試將文件放在閃存驅動器上,以查看是否有幫助,即使只是作爲測試。

+0

閃存驅動器?如在,拇指驅動器或SSD?如果是前者(尤其是USB 2.0的速度),那可能不會有幫助... – Ryan

+0

@minitech,我在寫SSD的時候一直在想SSD。拇指驅動器可能更容易通過,如果它的工作,你知道答案。如果它不起作用,那麼你不會變得更糟。 –

0

我不知道您的應用程序,但您可以保存新創建的圖像,並在生成新圖像之前檢查它是否是最新的。或者,保存更多信息並僅更新更改的部分。

但是,如果每次加載程序時一切都改變,瓶頸顯然是I/O延遲。如果沒有一個SSD金錢或raidsystem你不會通過它來;)

1

尺寸的圖像6032 * 6032和2個嵌套循環376 每個尺寸繪製近3600萬pixles至少2倍 和循環141000次

不要忘記閱讀文件...

我建議你嘗試並使用2個線程

相關問題