2014-01-13 3 views
0

В качестве части моего веб-приложения я использую javax.imageio.ImageIO для чтения/записи BufferedImage. Изначально приложение было запущено на Tomcat 7, и он работал довольно быстро. Поскольку я развернул свое приложение до , WebSphere 8.5.5 производительность чтения/записи значительно уменьшилась (в несколько раз медленнее).ImageIO.read/write slow in Websphere 8.5.5

Сначала я думал, что ImageIO плохо работает на WebSphere из-за JVM от IBM, поэтому я настроил Tomcat на использование IBM Java, и снова он стал намного лучше, чем в WebSphere. С Tomcat она занимает около 2.5secs и WebSphere12secs для чтения, обработки и записи изображения (размер ~ = 200KB).

Есть ли определенная конфигурация JVM IBM, которую я могу использовать для ускорения чтения изображений?

Вот выдержка из кода я использую:

// 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); 

Здесь конфигурация виртуальной машины Java я использовал (изменен):

Tomcat 7.0.50: -Xms512m -Xmx1024m -XX : PermSize = 128m -XX: MaxPermSize = 512m

WebSphere 8.5.5: Начальный размер кучи 512m, Максимальный размер кучи: 1280m

IBM Java 1.7_64

Windows 7

Есть ли конфигурация WebSphere Я не в курсе, что может ускорить обработку?

+0

Если у вас нет уже сделали это, вы можете попробовать подключить профилировщик к вашему процессу WebSphere и посмотреть, где потрачено время. Разница довольно удивительная ... – haraldK

+0

Я проверю это, thanx для комментариев! – Igor

ответ

1

После профилирования я нашел причину медленного ответа.

Большой части времени, потребляемое в WebSphere во время обработки изображения был вызван классом ResampleOp, а именно:

com.twelvemonkeys.image.ResampleOp.resample 

метод был узким местом для процесса изменения размера изображения. С родной Java AffineTransform мне не удалось получить изображения с хорошим качеством, поэтому я использовал библиотеку imgscalr. imgscalr выполняет очень хорошо в моем случае (как Tomcat & WebSphere), так и фотографии хорошего качества.

Я по-прежнему использую JPEGImageReader от Twelvemonkey для правильного считывания изображений CMYK JPEG.

UPDATE:

Resize код, который я имел с ResampleOP был:

ResampleOp resampleOp = new ResampleOp(width, height); 
BufferedImage rescaledImage = resampleOp.filter(image, null); 

С Scalr, код, я использую сейчас:

BufferedImage rescaledImage = Scalr.resize(image, width, height); 
+0

Но вы выяснили, почему это медленнее в WebSphere, чем Tomcat? Отказ от ответственности: я являюсь автором класса вопросов, поэтому я хотел бы знать, почему и если возможно что-то сделать. Возможно, вам понадобится создать [вопрос] (https://github.com/haraldk/TwelveMonkeys/issues), если он будет работать необоснованно. :-) – haraldK

+0

Прежде всего, спасибо за отличную библиотеку :) В обновленном ответе вы можете увидеть изменение кода, которое я сделал для решения проблемы производительности. К сожалению, я не мог понять, почему изменение размера было настолько плохим в WebSphere. Проблематичным методом является ResampleOp.filter -> ResampleOp.sinc. Если бы это помогло, я предоставил данные профилирования и образцы изображений. – Igor

+0

Да, пожалуйста. :-) Пошлите это, и я посмотрю. – haraldK

Смежные вопросы