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);
Другие вопросы по тегам