2013-12-19 190 views
0

我試圖讓方法在小於50毫秒內完成,但我似乎無法弄清楚如何提高方法的整體速度。我爲像素使用了一個對象,因爲我需要在壓縮數據時檢查null。java方法提高效率

public static Frame getFrame(Dimension d, Robot r, Rectangle s, Resolution rs) 
{ 
    int w = d.width; 
    int h = d.height; 
    BufferedImage b = r.createScreenCapture(s); 
    Pixel[] pixels = new Pixel[w * h]; 
    for(int i = 0; i < w; i++) 
    { 
     for(int j = 0; j < h; j++) 
     { 
      pixels[j * w + i] = new Pixel(b.getRGB(i, j)); 
     } 
    } 
    return new Frame(rs, pixels, true); 
} 

下面是像素級

public Pixel(int c) 
{ 
    if((c & 0xFF) == 0xA || (c & 0xFF) == 0xD) 
     c++; 
    if((c & 0xFF00) == 0xA00 || (c & 0xFF00) == 0xD00) 
     c += 0x100; 
    if((c & 0xFF0000) == 0xA0000 || (c & 0xFF0000) == 0xD0000) 
     c += 0x10000; 
    if((c & 0xFF000000) == 0xA000000 || (c & 0xFF000000) == 0xD000000) 
     c += 0x1000000; 
    color = c; 
} 

構造而這裏的Frame類

public Frame(Resolution res, Pixel[] pix, boolean ignoreCheck) 
{ 
    if(!ignoreCheck) 
    { 
     if(pix.length < res.getTotalPixels()) 
      throw new NotEnoughPixelsException(res.getTotalPixels() - pix.length); 
     else if(pix.length > res.getTotalPixels()) 
      throw new TooManyPixelsException(pix.length - res.getTotalPixels()); 
    } 
    resolution = res; 
    pixels = pix; 
} 
+6

這個問題似乎是脫離主題,因爲它是關於代碼審查 - http://codereview.stackexchange.com/ – lifetimes

+1

根據我的經驗,解決性能問題的最佳方法是獲取一個分析器,並查看JVM真的在花時間。其他的一切都是猜測的工作,你猜測,做很多工作,然後發現你的猜測是錯誤的。啊。分析器是你的朋友。 –

+0

我不同意這是脫離主題。有一個具體的問題「我如何得到這種改進的表現」,答案表明可以給出具體的迴應。這不是一般的「這個代碼如何改進」。我同意它正在推動一些界限。 :) –

回答

4

不要使用類像素的構造。你將會建造數十萬,如果不是數百萬的話。

+0

我使用的是像素,因此我可以在代碼的後面幾點檢查null。我這樣做,以便我可以壓縮保存文件。 – EnderShadow

+1

寫入代碼的方式中,像素數組中不會有任何空的條目(或者以後將它們清空)。如果你正在尋找赤裸裸的低效率,那就在那裏(創造一些東西,以便稍後將它清空)。獲取個人資料,找到你的熱點。我與海豹隊員在一起,像素級的價值是可疑的,施工不是免費的。 –

+2

在這種情況下使用類似於數組的原始ints和bool的基本數組。設置像素時,將bool的值設置爲true。或者像普通的ARBG那樣將Alpha值放在32位整數中。通常我們會說「不要優化」,但在成像的情況下,像素類是完全矯枉過正的。如果你需要你的代碼比它快,你將不得不這樣做。 – slipperyseal