作为我的网络应用程序的一部分,我使用javax.imageio.ImageIO来阅读/撰写BufferedImage。 最初我的应用程序在 Tomcat 7 上运行,并且它运行得非常快。由于我已将我的应用程序部署到 WebSphere 8.5.5 ,因此读/写性能显着降低(慢几倍)。
起初,我认为由于IBM的JVM,ImageIO在WebSphere上表现不好,所以我已经将Tomcat配置为使用IBM Java,而且它在WebSphere上的表现要好得多。 使用 Tomcat 需要 2.5secs 并使用 WebSphere 12secs 来读取,处理和写入图像(大小〜= 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配置,这可以加快处理速度?
答案 0 :(得分: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);
使用Scalr,我现在使用的代码是:
BufferedImage rescaledImage = Scalr.resize(image, width, height);