我必须用自定义图像的内容填充BufferedImage,因为我想在JFrame中显示我的自定义图像。
在使用事件探查器检查代码之前,我使用了一个简单的for-Loop:
for(int x = 0; x < width, x++)
for(int y = 0; y < height; y++)
bufferedImage.setRGB(x, height-y-1, toIntColor( customImage.get(x,y) ));
那行得通,但我决定同时尝试。此代码将Image分为几列,并应并行复制每列(简化的代码段):
final ExecutorService pool = Executors.newCachedThreadPool();
final int columns = Runtime.getRuntime().availableProcessors() +1;
final int columnWidth = getWidth() / columns;
for(int column = 0; column < columns; column++){
final Rectangle tile = Rectangle.bottomLeftRightTop(
0,
columnWidth*column,
columnWidth*(column+1),
height
);
pool.execute(new ImageConverter(tile));
}
pool.shutdown();
pool.awaitTermination( timeoutSeconds, TimeUnit.SECONDS);
ImageConverterRunnable:
private final class ImageConverter implements Runnable {
private final Rectangle tile;
protected ImageConverter(Rectangle tile){ this.tile = tile; }
@Override public void run(){
for(int x = tile.left; x < tile.right; x++)
for(int y = tile.bottom; y < tile.top; y++)
bufferedImage.setRGB(x, height-y-1, toIntColor( customImage.get(x,y) )); }
}
我注意到并发解决方案花费的时间比简单的for-loop长约2至3倍。
我已经在寻找这样的问题并用谷歌搜索了,但没有找到任何东西。
为什么要花这么长时间?
是否因为awaitTermination()行?
转换图片是否有更好的解决方案?
在此先感谢,约翰尼斯:)
编辑:
我已经做了一些测试。
在进行3000次图像转换的预热之前,先测量所有转换。
简单的for-loop需要7到8毫秒来复制位图。
并行图像复制每个图像花费20到24毫秒。没有预热就花了60毫秒。
最佳答案
使用线程不会加快执行速度(常见的误解)。我的假设是使用线程的开销导致程序运行速度变慢。上下文切换非常昂贵。
通常,线程在某些东西阻塞时很有用。我看不到您提供的任何阻止代码。