0

作为我的 Web 应用程序的一部分,我使用javax.imageio.ImageIO来读取/写入BufferedImage。最初我的应用程序在Tomcat 7上运行,并且运行速度非常快。自从我将我的应用程序部署到WebSphere 8.5.5后,读/写性能显着下降(慢了几倍)。

起初,我认为 ImageIO 在 WebSphere 上表现不佳是因为 IBM 的 JVM,所以我将 Tomcat 配置为使用 IBM Java,但它在 WebSphere 上的表现再次好得多。使用Tomcat大约需要2.5 秒,使用WebSphere需要 12 秒来读取、处理和写入图像(大小 ~= 200KB)。

我可以使用一些 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=128m -XX:MaxPermSize=512m

WebSphere 8.5.5:初始堆大小 512m,最大堆大小:1280m

IBM Java 1.7_64

Windows 7的

是否有任何我不知道的 WebSphere 配置可以加快处理速度?

4

1 回答 1

1

分析后,我找到了响应缓慢的原因。

WebSphere 在图像处理过程中消耗的大部分时间是由 ResampleOp 类引起的,具体来说:

com.twelvemonkeys.image.ResampleOp.resample

方法是图像调整大小过程的瓶颈。使用本机 Java 的AffineTransform我无法获得高质量的调整大小的图像,因此我最终使用了imgscalr库。imgscalr在我的情况下(Tomcat 和 WebSphere)表现非常好,并且图片质量很好。

我仍在使用 Twelvemonkey 的 JPEGImageReader 来正确读取 CMYK JPEG 图像。

更新:

我使用 ResampleOP 调整大小的代码是:

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

使用 Scalar,我现在使用的代码是:

BufferedImage rescaledImage = Scalr.resize(image, width, height);
于 2014-01-13T17:49:13.897 回答