从文件到内存的Java读/写BufferedImage性能

时间:2019-05-24 21:46:00

标签: java image

我有一个http客户端,它获取一个json响应,其中包含一个png图像字符串,然后旋转该图像。

一切正常,但我很好奇,为什么(METHOD 1)将http响应图像保存在内存中作为BufferedImage,然后旋转所说的BufferdImage比(METHOD 2)将http响应图像保存到文件然后读取要慢旋转相同的BufferedImage之前将该文件复制到BufferedImage?

这与我们都知道在内存中执行类似的读/写操作要比文件I / O快得多。我运行Java的笔记本电脑具有足够的内存和磁盘空间。

////////////METHOD 1 - WRITE/READ IMAGE FROM MEMORY
log.info("START TEST1 " + new Timestamp(System.currentTimeMillis()));
OutputStream outputStream = null;
byte[] imageByteArray = 
    Base64.decodeBase64(jsonObj.getString("LabelImages"));

//Convert byte array back to BufferedImage
InputStream in = new ByteArrayInputStream(imageByteArray);
BufferedImage img = ImageIO.read(in);

BufferedImage rotatedImg = rotate(img, 90);
File outputfile = new File("/var/opt/DI/tmp/rotatedlabel" + orderId + ".png");
ImageIO.write(rotatedImg, "png", outputfile);
log.info("END TEST1 " + new Timestamp(System.currentTimeMillis()));

////////////METHOD 2 - WRITE/READ IMAGE FROM FILE
log.info("START TEST2 " + new Timestamp(System.currentTimeMillis()));
writeImageStringToFile(jsonObj.getString("LabelImages"), orderId);
BufferedImage rotatedImg2 = rotate(ImageIO.read(new 
File("/var/opt/DI/tmp/label" + orderId + ".png")), 90);
File outputfile2 = new 
File("/var/opt/openbravo/bluecrest/DI/tmp/rotatedlabel" + orderId + ".png");
ImageIO.write(rotatedImg2, "png", outputfile2);
log.info("END TEST2 " + new Timestamp(System.currentTimeMillis()));

METHOD 2 is about 10% faster than METHOD 1.

1 个答案:

答案 0 :(得分:0)

您需要告诉我们您是如何进行性能测试的。如果您按照此处的描述进行操作(在同一程序中调用方法1,然后调用方法2),我的猜测是这是由于JIT在method1期间优化了rotate方法,并在method2期间享受了这种优化,以至于克服了磁盘操作。

就个人而言,当我进行性能比较测试时,我在程序中运行method1大约10次,消除两个或三个最差的结果,然后在单独的程序中对method2进行相同的操作。通常,这会给JIT足够的时间投入使用,并给出更多有意义的数字。

相关问题