我目前正在开发一种使用图像的软件。软件从HD加载并使用它们但不修改它们。
因此,我将一些图像实例化到RAM中。 在特定情况下,我必须将这些图片写在硬盘驱动器上(但是在与其原始位置不同的目录中)。
实际上,我不知道最有效的方法是什么。将文件从一个文件夹复制到另一个文件夹(使用Files.copy()
)是否更快?或者我应该将加载RAM的图片写入新文件(例如使用BufferedWriter
)?
在我看来,从加载的图片中写入新文件可能会更快,因为它不必读取HD上的文件。但是,我不确定,我不知道Files.copy()
背后的真正过程是什么。
任何人都可以帮助我吗?
感谢。
答案 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存储到文件系统的速度更快,因为您不必再从文件系统中读取它。