【发布时间】:2021-12-22 10:30:19
【问题描述】:
我尝试了各种不同的标志组合,例如 FILE_FLAG_NO_BUFFERING 和 FILE_FLAG_OVERLAPPED,但 fstream::write 仍然优于 Windows API 版本。
std::fstream 是否使用了内部缓冲或其他技巧,还是我只是搞砸了什么?
#include <Windows.h>
#include <chrono>
#include <fstream>
#include <iostream>
std::string createTempFileName()
{
char buf[800];
tmpnam_s(buf, sizeof(buf));
return buf;
}
using namespace std::chrono;
int main()
{
std::uint64_t count = 1 << 23;
std::cout << "test fstream\n";
{
auto start = steady_clock::now();
auto path = createTempFileName();
std::fstream fs(path, std::ios_base::out | std::ios_base::in | std::ios_base::trunc | std::ios_base::binary);
for (std::uint64_t i = 0; i < count; i++)
fs.write((char*)&i, sizeof(i));
fs.close();
DeleteFile(path.c_str());
auto end = steady_clock::now();
std::cout << "fstream: Elapsed time in milliseconds : " << duration_cast<milliseconds>(end - start).count() << " ms\n";
}
std::cout << "test WriteFile\n";
{
auto start = steady_clock::now();
auto path = createTempFileName();
HANDLE file = CreateFile(path.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING, NULL);
for (std::uint64_t i = 0; i < count; i++)
WriteFile(file, &i, sizeof(i), NULL, NULL);
CloseHandle(file);
DeleteFile(path.c_str());
auto end = steady_clock::now();
std::cout << "WriteFile: Elapsed time in milliseconds : " << duration_cast<milliseconds>(end - start).count() << " ms\n";
}
}
【问题讨论】:
-
快速查看source 表明MSVC 的
fstream使用fwrite()。所以也许下面的问答可以提供一些见解:stackoverflow.com/questions/14290337/… -
@Frank,我在写这个问题之前看到了那个帖子,但它并没有真正帮助,无论如何谢谢=)
-
您的 PC 上的结果是什么?你有什么电脑?你有什么磁盘?为什么“NO_BUFFERING”要快?为什么阅读链接的文章没有帮助?
-
有一个关于what makes a good performance question的元讨论。恕我直言,这不是一个好的性能问题。它缺少所有与性能相关的信息。
-
这看起来像是责备工具类问题的变体。在 Windows 上写入文件的方法并不多。
fwrite()很可能在下面使用WriteFile()。真正的问题应该是我做错了什么?