【发布时间】:2019-11-16 11:37:30
【问题描述】:
我一直在尝试尽可能快地写入文件数据。
- 我增加了缓冲区大小以减少 i/o 操作。
- 我已经使用 fstream 和 fopen 进行了测试。
由于某种原因,fstream 比 fopen 快。
- 在 64 字节缓冲区上,它的速度提高了约 1.3 倍
- 在 8192 字节缓冲区上,它的速度提高了约 4.8 倍。
我一直听说 C 的文件 I/O 更快(这是有道理的)<fstream> 包括 <stdio.h> 但我无法让 fopen 执行得这么快。
注意(旧问题):
- 我的 fopen 比 fstream 慢 2 倍,因为我使用了 fprintf(感谢 jamesdlin)
- fstream 缓冲区没有改变,因为您必须在打开之前设置它(感谢Paul Sanders)
也实现了 fstream.put(char) 比 fstream 快 (否则,如果缓冲区
这是我的测试:
#include <iostream>
#include <fstream>
#include <ctime>
int filesize; // total bytes (individually "put" in buffered stream)
int buffsize; // buffer size
void writeCPP(){
std::ofstream file;
char buffer[buffsize]; file.rdbuf()->pubsetbuf(buffer,buffsize); // set buffer (before opening)
file.open("test.txt",std::ios::binary); // open file
for(int i=0; i<filesize; i++) file.put('a'); // write bytes
file.close(); // close
}
void writeC(){
FILE* file=fopen("test.txt","wb"); // open file
char buffer[buffsize]; setvbuf(file,buffer,_IOFBF,buffsize); // set buffer
for(int i=0; i<filesize; i++) fputc('a',file); // write bytes
fclose(file); // close
}
#define getTime() double(clock())/CLOCKS_PER_SEC // good enough
double start;
void test(int s){ // C++ vs C (same filesize / buffsize)
buffsize=s;
std::cout<<" buffer: "<<buffsize<<"\t"<<std::flush;
start=getTime();
writeCPP();
std::cout<<" C++: "<<getTime()-start<<",\t"<<std::flush;
start=getTime();
writeC();
std::cout<<" C: "<<getTime()-start<<std::endl;
}
#define MB (1024*1024)
int main(){
filesize=10*MB;
std::cout<<"size: 10 MB"<<std::endl;
// C++ fstream faster
test(64); // C++ 0.86 < C 1.11 (1.29x faster)
test(128); // C++ 0.44 < C 0.79 (1.80x faster) (+0.51x)
test(256); // C++ 0.27 < C 0.63 (2.33x faster) (+0.53x)
test(512); // C++ 0.19 < C 0.56 (2.94x faster) (+0.61x)
test(1024); // C++ 0.15 < C 0.52 (3.46x faster) (+0.52x)
test(2048); // C++ 0.14 < C 0.51 (3.64x faster) (+0.18x)
test(4096); // C++ 0.12 < C 0.49 (4.08x faster) (+0.44x)
test(8192); // C++ 0.10 < C 0.48 (4.80x faster) (+0.72x)
}
【问题讨论】:
-
我没有读到你的测量方法——你做错了。
-
@TedLyngmo 该评论令人难以理解。
-
另外,发现 C++ 流变慢并不是“攻击”。
-
呃,这个问题不是声称 C++ 流比 C 流快吗? C++ 如何“受到攻击”是任何意义?
-
@jamesdlin 谢谢!解决了它。哈哈,终于有人真正想帮忙了!