将图像写入新文件或复制它们是否更快?

Is it faster to write Images into a new file or to copy them?

我目前正在开发一个使用图像的软件。软件从 HD 加载它们并使用它们,但它不会修改它们。

因此,我将一些图像实例化到 RAM 中。 在特定情况下,我必须将这些图片写入硬盘驱动器(但位于与原始位置不同的目录中)。

实际上,我不知道最有效的方法是什么。将文件从一个文件夹复制到另一个文件夹(使用 Files.copy())是否更快,还是我应该将加载 RAM 的图片写入一个新文件(例如使用 BufferedWriter)?

在我看来,从加载的图片写入新文件可能会更快,因为它不必读取 HD 上的文件。但是,我不确定,我不知道Files.copy().

背后的真正过程是什么

谁能帮帮我?

谢谢。

将 RAM 加载的图像存储到文件系统会更快,因为您不必从文件系统再次读取它。

我敢打赌复制通常更快。

  • 如果幸运的话,图像由 OS 缓冲,您不会真正访问磁盘来读取它,因此从内存写入的优势消失了。

  • 任何正常的图像格式(我不是指 BMP)都会被压缩,而内存中的图像不会(您想使用它,对吗?)。压缩是一个相当慢的操作。

综上所述,只有测量才能确定。


我使用 JPG 作为我的基准测试,因为它是一种计算量大的格式。

private void go() throws Exception {
    final BufferedImage image = ImageIO.read(src);
    for (int i=0; i<100; ++i) {
        write(image);
        copy();
    }
}

private void write(BufferedImage image) throws Exception {
    final long start = System.nanoTime();
    ImageIO.write(image, "jpg", dst);
    final long end = System.nanoTime();
    System.out.format("write %15.6f\n", 1e-9 * (end-start));
}

private void copy() throws Exception {
    final long start = System.nanoTime();
    Files.copy(src.toPath(), dst.toPath(), StandardCopyOption.REPLACE_EXISTING);
    final long end = System.nanoTime();
    System.out.format("copy  %15.6f\n", 1e-9 * (end-start));
}

结果如下

write        0.200160
copy         0.001850
write        0.200056
copy         0.001886

所以复制胜出两个数量级。谁说使用 JPG 不公平,谁应该自己测试一下。