Java JPEG压缩时间

Java JPEG压缩时间,java,jpeg,javax.imageio,Java,Jpeg,Javax.imageio,我有一个方法可以将图像压缩为jpg格式并返回其字节数组。下面是它的代码: public static byte[] CompressToJpeg(BufferedImage image, float compressionQuality) throws IOException { File compressedImageFile = new File("compressed_image.jpg"); OutputStream os = new FileOutputStream(c

我有一个方法可以将图像压缩为jpg格式并返回其字节数组。下面是它的代码:

public static byte[] CompressToJpeg(BufferedImage image, float compressionQuality) throws IOException {
    File compressedImageFile = new File("compressed_image.jpg");
    OutputStream os = new FileOutputStream(compressedImageFile);

    Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
    ImageWriter writer = (ImageWriter) writers.next();

    ImageOutputStream ios = ImageIO.createImageOutputStream(os);
    writer.setOutput(ios);

    ImageWriteParam param = writer.getDefaultWriteParam();

    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionQuality(compressionQuality);
    writer.write(null, new IIOImage(image, null, null), param);

    os.close();
    ios.close();
    writer.dispose();

    return Files.readAllBytes(compressedImageFile.toPath());
}
public static byte[]CompressToJpeg(缓冲图像图像,浮点压缩质量)引发IOException异常{
File compressedImageFile=新文件(“compressed_image.jpg”);
OutputStream os=新文件OutputStream(compressedImageFile);
迭代器编写器=ImageIO.getImageWritersByFormatName(“jpg”);
ImageWriter writer=(ImageWriter)writers.next();
ImageOutputStream ios=ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam参数=writer.getDefaultWriteParam();
参数setCompressionMode(ImageWriteParam.MODE_显式);
参数设置压缩质量(压缩质量);
writer.write(null,新IIOImage(image,null,null),param);
os.close();
ios.close();
writer.dispose();
返回Files.readAllBytes(compressedImageFile.toPath());
}

而且,当我第一次运行此压缩时,所需的时间总是比下一次运行时长得多。我的问题是为什么会这样

正如我在评论中发布的链接中所提到的,这在Java的所有东西中都很常见:

Java的第一次执行总是比后续运行慢。有一个启动开销,因为

一般来说:

  • 第一次使用类时,类装入器必须查找、装入、验证和初始化该类
  • 第一次运行代码时,将对其进行解释。热点/JIT将在一些预定义的阈值之后对其进行优化。如果您的代码第一次达到这个阈值(即循环),那么部分代码可能会在第一次运行时进行优化,这需要更多的时间
ImageIO
类尤其需要在启动时做很多事情:

  • 服务提供者查找和实例化所有可用插件。可用的插件越多,需要的时间就越多
  • 因为它是Java桌面模块的一部分,所以它的某些部分或插件可能会触发Java2D子系统的初始化。使用headless系统属性可能有助于加快速度
  • 尤其是JPEG插件,它使用本机代码,这也必须在第一次执行时加载、初始化
(另外,可能还有更多我没有想到的事情)。

相关: