【问题标题】:Is it faster to write Images into a new file or to copy them?将图像写入新文件或复制它们更快吗?
【发布时间】:2015-05-12 12:34:17
【问题描述】:

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

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

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

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

谁能帮帮我?

谢谢。

【问题讨论】:

  • 复制文件肯定更快。更不用说更简单了。

标签: java image performance io copy


【解决方案1】:

我敢打赌,复制通常会更快。

  • 如果幸运的话,图像由操作系统缓冲,而您并没有真正访问磁盘来读取它,因此从内存写入的优势就消失了。

  • 任何合理的图像格式(我不是指 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 不公平的人应该自己进行测试。

【讨论】:

  • 你的回答对我来说很有意义。我将尝试两种解决方案来评估哪一种最有效。但是你关于压缩的建议让我觉得你可能是对的。
  • 我做了一个测试,从内存写入比文件复制快 50%,所以这不是正确的答案。
  • @chokdee 获得更慢的 CPU 和/或更快的磁盘,然后就可以了。你用的是什么格式?不是 JPG,对吧?
  • @maaartinus 所以你似乎不会相信,在写错答案之前做你自己的测试或者相信你想要的任何东西。顺便说一句:这是一个 jpeg 文件,我使用了 SDD,还有其他问题吗?
  • @chokdee 对我来说,抄袭胜出,请参阅我的更新。 SSD,i5-2400 CPU @ 3.10GHz,3MB JPG。
【解决方案2】:

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

【讨论】:

  • 从文件中读取永远不会比从内存中读取快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2012-08-28
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2013-07-16
相关资源
最近更新 更多