gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:48:23 25 4
gpt4 key购买 nike

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

在使用 Profiler 检查我的代码之前,我使用了一个简单的 for 循环:

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) ));

那行得通,但我决定同时尝试一下。此代码将图像分成几列,并应平行复制每一列(简化代码片段):

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 循环需要 7 到 8 毫秒来复制位图。

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

最佳答案

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

一般来说,线程在某些东西阻塞时很有用。我在您提供的内容中没有看到任何阻止代码。

关于Java:并发性比简单的 for-Loop 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31989463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com