文件系统:复制功能的速度秘诀是什么

What is the secret to the speed of the filesystem::copy function?

本文关键字:是什么 速度 复制 功能 文件系统      更新时间:2023-10-16

我正在努力达到filesystem::copy读取文件内容并将该内容写入新文件的速度"复制操作";但我达不到那个速度。

以下是我尝试的一个简单示例:

void Copy(const wstring &fromPath, const wstring &toPath) {
ifstream readFile(fromPath.c_str(), ios_base::binary|ios_base::ate);    
char* fileContent = NULL;
if (!readFile) { cout << "Cannot open the file.n"; return; }
ofstream writeFile(toPath.c_str(), ios_base::binary);
streampos size = readFile.tellg();
readFile.seekg(0, ios_base::beg);
fileContent = new char[size];
readFile.read(fileContent, size);
writeFile.write(fileContent, size);
readFile.close();
writeFile.close();
delete[] fileContent;
}

以前的代码可以复制一个文件。因此它的大小";1.48GB";介于";8至9〃;而filesystem::copy能够在"秒"之间复制相同的文件;1至2";最长为秒
注意:我不想在本期使用C++17。

如何使函数的速度像filesystem::copy

您的实现需要分配整个文件大小的缓冲区。这是浪费,你可以只读取64k,写入64k,重复下一个块。

分页内存是有成本的。如果你读了整件事,然后写了整件事情,你最终会对整个文件进行两次分页。

可能是多个线程可能分别进行读/写(前提是读保持在前(。这可能会加快速度。

有了硬件支持,甚至可能不需要数据一直传输到CPU。然而,您的实现可能最终会这样做。编译器很难推理您对fileContent做了什么或不做了什么。

filesystem::copy的实现可能会使用无数其他技巧。你可以去看看它是如何编码的,有很多开放的实现。

但有一点需要注意:标准库的实现可能依赖于语言无法保证的特定行为。因此,您不能简单地将代码复制到不同的编译器/体系结构/平台。