我正在尝试使用 std::ofstream 打开一个文件进行写入,并且我想将其设置为直写模式(即使用 CreateFile Win API 提供的“FILE_FLAG_WRITE_THROUGH”)。
有没有一些 STL 方法来实现它?
我不想写基于 WinAPI 的代码。
我的目标是禁用操作系统缓存并使用不同的块大小执行写入,以获得与存储性能相关的数据。
我无法使用标准的基准测试工具,因为目标是了解如何针对我必须依赖的特定存储优化我的写入层设置。
@更新
这是一个 MWE,我希望在更改 blk_size 的值时看到不同的保存时间:
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <vector>
#include <ctime>
std::vector<unsigned char>
GenerateRandomData(long numBytes)
{
std::vector<unsigned char> res(numBytes);
std::srand(std::time(0));
for (int i = 0; i < numBytes; ++i)
res[i] = static_cast<unsigned char>(std::rand() % 256);
return res;
}
int main(int, char)
{
// generate random data
const long dataLength = 1 * 1024 * 1024 * 1024; // 3 GB
std::vector<unsigned char> outbuf = GenerateRandomData(dataLength);
// define I/O block size (
const auto blk_size = 128 * 1024; // 128K
char blk[blk_size];
// configure output stream
std::ofstream ofs;
ofs.rdbuf()->pubsetbuf(blk, blk_size);
ofs.setf(std::ios_base::unitbuf);
// open file to write
ofs.open("output.dat", std::ofstream::binary | std::ofstream::trunc);
// write all data performing 512K I/O Operations
auto ptr_idx = 0;
auto ptr = reinterpret_cast<char*>(outbuf.data());
const auto outbuf_size = outbuf.size();
std::clock_t sw = clock();
ofs.write((const char *)&ptr[ptr_idx], outbuf_size);
ofs.flush();
ofs.close();
sw = ( clock() - sw );
double writtenBytes = static_cast<double>(outbuf.size());
double writtenMBytes = writtenBytes / (1024 * 1024);
double testSeconds = static_cast<double>(sw) / static_cast<double>(CLOCKS_PER_SEC);
double avgSpeed = writtenMBytes / testSeconds;
std::cout << "Benchmark: written " << writtenMBytes << " MB in " << testSeconds << " sec. => " << avgSpeed << "MB/s" << std::endl;
std::getchar();
return 0;
}
先感谢您
最佳答案
使用:std::unitbuf
std::ofstream outfile ("file.txt");
outfile << std::unitbuf << "Hello\n"; // immediately flushed
关于C++ 写选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36767806/