2013-12-19 142 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