ImageIO.read/write медленно в Websphere 8.5.5
Как часть моего веб-приложения, я использую javax.imageio.ImageIO для чтения / записи BufferedImage. Первоначально мое приложение работало на Tomcat 7, и оно работало довольно быстро. С тех пор, как я развернул свое приложение в WebSphere 8.5.5, производительность чтения / записи значительно снизилась (в несколько раз медленнее).
Сначала я думал, что ImageIO плохо работает в WebSphere из-за JVM от IBM, поэтому я настроил Tomcat для использования IBM Java, и опять-таки он работал намного лучше, чем в WebSphere. С Tomcat требуется около 2,5 с, а с WebSphere 12 с - чтение, обработка и запись образа (размер ~ = 200 КБ).
Есть ли какая-то особая конфигурация IBM JVM, которую я могу использовать для ускорения чтения изображений?
Вот выдержка из кода, который я использую:
// srcImagePath & dstImagePath are both pointing
// to the location outside app servers
BufferedImage image = ImageIO.read(new File(srcImagePath));
// here I am only resizing image using com.twelvemonkeys.image.ResampleOp
// from twelvemonkeys library
BufferedImage destImage = resizeImage(image);
ImageIO.write(destImage, "jpg", dstImagePath);
Вот конфигурация JVM, которую я использовал (изменил):
Tomcat 7.0.50: -Xms512m -Xmx1024m -XX: PermSize = 128 м -XX:MaxPermSize=512 м
WebSphere 8.5.5: начальный размер кучи 512 м, максимальный размер кучи: 1280 м
IBM Java 1.7_64
Windows 7
Есть ли какая-либо конфигурация WebSphere, о которой я не знаю, которая могла бы ускорить обработку?
1 ответ
После профилирования я нашел причину медленного ответа.
Большая часть времени, потребляемого в WebSphere во время обработки изображений, была вызвана классом ResampleOp, а именно:
com.twelvemonkeys.image.ResampleOp.resample
Метод был узким местом для процесса изменения размера изображения. С помощью AffineTransform, встроенной в Java, я не смог получить качественные изображения с измененным размером, поэтому я использовал библиотеку imgscalr. imgscalr работает очень хорошо в моем случае (как Tomcat, так и WebSphere) и с качественными фотографиями.
Я по-прежнему использую Twiemonkey JPEGImageReader для правильного чтения изображений CMYK JPEG.
ОБНОВИТЬ:
Код изменения размера, который я имел с ResampleOP, был:
ResampleOp resampleOp = new ResampleOp(width, height);
BufferedImage rescaledImage = resampleOp.filter(image, null);
С Scalr код, который я использую сейчас:
BufferedImage rescaledImage = Scalr.resize(image, width, height);