将图像写入新文件或复制它们是否更快?
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 不公平,谁应该自己测试一下。
我目前正在开发一个使用图像的软件。软件从 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 不公平,谁应该自己测试一下。