如何增强 C 语言的文件写入性能
将大量数据写入二进制文件时,优化性能至关重要。以下是如何提高您的写入速度:
利用 FILE* 进行直接文件处理:
在示例代码中,使用 FILE* 允许直接文件访问,绕过中间层并减少开销。正如原始问题中所观察到的,这种方法带来了显着的性能提升。
FILE* 用法的代码优化:
#include <stdio.h> ;<br>const unsigned long long size = 8ULL<em>1024ULL</em>1024ULL;<br>unsigned long long a[size];<p>int main()<br>{</p> <pre class="brush:php;toolbar:false">FILE* pFile; pFile = fopen("file.binary", "wb"); for (unsigned long long j = 0; j < 1024; ++j){ // Some calculations to fill a[] fwrite(a, 1, size*sizeof(unsigned long long), pFile); } fclose(pFile); return 0;
}
< /pre>
此优化代码利用FILE* 直接写入二进制文件,实现更快的写入速度。
方法比较:
最近的测量表明 std::fstream 提供了与 FILE 相当的性能* 用于大文件写入。以下是不同方法的比较:
#include <fstream><h1>include <chrono></chrono> </h1> <h1>include <vector></vector> </h1> <h1>包括 <cstdint></cstdint> </h1> <h1>包括</h1> <h1>包括</h1> <h1>包括</h1> <h1>包括<iostream></iostream> </h1> <h1>包括<cassert></cassert> </h1> <p>长长长长option_1(std::size_t 字节)<br>{</p> <pre class="brush:php;toolbar:false">// Using std::fstream std::vector<uint64_t> data = GenerateData(bytes); auto startTime = std::chrono::high_resolution_clock::now(); auto myfile = std::fstream("file.binary", std::ios::out | std::ios::binary); myfile.write((char*)&data[0], bytes); myfile.close(); auto endTime = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
}
long long option_2(std::size_t bytes)
{
// Using FILE* std::vector<uint64_t> data = GenerateData(bytes); auto startTime = std::chrono::high_resolution_clock::now(); FILE* file = fopen("file.binary", "wb"); fwrite(&data[0], 1, bytes, file); fclose(file); auto endTime = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
}
测量结果表明 option_1 (std::fstream) 和 option_2 (FILE*) 都实现了相当的性能对于大文件
结论:
对于将大缓冲区写入 C 中的二进制文件,FILE* 和 std::fstream 都提供高性能。两者之间的选择取决于具体要求和偏好。
以上是如何用C实现最佳的文件写入性能?的详细内容。更多信息请关注PHP中文网其他相关文章!