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

时间:2015-05-12 12:34:17

标签: java image performance io copy

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

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

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

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

任何人都可以帮助我吗?

感谢。

2 个答案:

答案 0 :(得分: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不公平的人应该自己进行测试。

答案 1 :(得分:0)

将加载RAM的Image存储到文件系统的速度更快,因为您不必再​​从文件系统中读取它。