Производительность чтения / записи Java BufferedImage из файла в сравнении с памятью - PullRequest
0 голосов
/ 25 мая 2019

У меня есть клиент http, который получает ответ json, содержащий строку изображения png, которую я затем поворачиваю.

Все работает, как и ожидалось, но мне было любопытно узнать, почему (МЕТОД 1) сохранение изображения ответа http вПамять как BufferedImage перед вращением указанного BufferdImage медленнее, чем (МЕТОД 2) сохранение изображения ответа http в файл и затем чтение этого файла в BufferedImage перед вращением того же BufferedImage?

Это противоречит тому, что мы всезнать, что делать как для чтения / записи в памяти быстрее, чем файловый ввод-вывод.Мой ноутбук, на котором работает 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 голосов
/ 25 мая 2019

Вы должны рассказать нам, как вы прошли тест производительности.Если вы сделаете это так, как написано здесь (вызов метода 1, а затем метода 2 в той же программе), я предполагаю, что это происходит из-за того, что JIT оптимизирует метод rotate во время метода 1 и наслаждается этой оптимизацией во время метода 2 до точки, где он преодолевает дископерации.

Лично, когда я делаю тесты сравнения производительности, я запускаю method1 как 10 раз в программе, исключаю два или три худших результата, затем делаю то же самое с method2 в отдельной программе.Обычно это дает JIT достаточно времени для включения и дает более значимые цифры ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...