Java:并发性比简单的for-Loop慢

时间:2015-08-13 13:20:17

标签: java image swing concurrency

我必须使用自定义图像的内容填充BufferedImage,因为我想在JFrame中显示我的自定义图像。

在使用Profiler检查我的代码之前,我使用了一个简单的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长了大约两到三倍。 我已经找过这样的问题并用谷歌搜索,但我没有找到任何东西。

为什么需要这么长时间?   它是因为awaitTermination()行吗?   是否有更好的转换图像解决方案?

先谢谢,约翰内斯:)

编辑:

我已经进行了一些测试。 所有测量的转换都是在3000次图像转换的预热之后。

简单的for-Loop需要7到8毫秒来复制位图。

并行图像复制每张图像需要20到24毫秒。没有热身,花了60毫秒。

1 个答案:

答案 0 :(得分:2)

使用线程不会加速执行(常见的误解)。我的假设是使用线程的开销导致程序运行速度变慢。上下文切换非常昂贵。

通常,线程在阻塞时很有用。我没有看到您提供的任何阻止代码。