我正在尝试将 RGB 值的字节数组保存为 png 图像,如下所示:
byte[] imgArray = ...;
int canvasSize = 512;
ColorModel c = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), null, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
Image image = Toolkit.getDefaultToolkit().createImage(
new MemoryImageSource(canvasSize, canvasSize, c, imgArray, 0, canvasSize));
BufferedImage bimage = new BufferedImage(canvasSize, canvasSize, BufferedImage.TYPE_BYTE_GRAY);
// Draw the image on to the buffered image
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(image, 0, 0, null); //This is what takes all the time
bGr.dispose();
ImageIO.write(bimage, "PNG", new File(uniqueFileName));
我正在使用 FixedThreadpool 同时保存多个图像。我使用的线程越多(最多达到我计算机上的空闲内核数),保存过程花费的时间就越长。在 6 个线程上运行的时间几乎是在一个线程上运行的两倍。
为什么多线程会花费这么长的时间?内存交换?我可以避免这个问题吗?
此外,如果我有更好的方法从数组中保存 png,请告诉我。
编辑以显示图片被保存为不同的图像,而不是相互覆盖。
最佳答案
我认为这是由不同类型的优化引起的。您正试图在一个路径中一次保存多个图像 - 这意味着需要 排队保存操作 - 这是一个 IO 绑定(bind)任务,而不是 CPU 绑定(bind)。多个保存线程在这里可能不是很有帮助。同样在非常小的(就 CPU 功率要求而言)操作中,委派线程来完成工作可能只会带来额外的开销,从而导致完成任务所需的时间延长,而不是缩短。希望这会有所帮助:)
关于java - 为什么多线程会变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35264582/