这一切都始于这个问题->如何从文件中读取数据块,然后从该块读取到向量中?
为了最小化磁盘 I/O 操作,我进行了一些实验,看看缓冲区的大小是否对程序花费的时间有任何影响。
我使用了以下两个代码,一个是面向 c 的,另一个是 c++(尽管都是用 gcc 编译的):-
面向c的代码:-
int buffer_size=1024;
FILE *file;
file = fopen(argv[1], "r");
FILE *out_file;
out_file = fopen("in", "w");
char out_buffer[2048];
setvbuf(out_file, out_buffer, _IOFBF, buffer_size);
char buffer[2048];
setvbuf(file, buffer, _IOFBF, buffer_size);
while (!feof(file))
{
char sl[1000];
fgets(sl, 140 , file);
fputs(sl, out_file);
}
c 代码给出了以下结果(对于 14 mb 文件):-
Buffer_size Time
10 18 sec
100 2 sec
1024 0.4 sec
10240 0.3 sec
(对于 103 mb 文件)
1024 ~8 sec
5120 ~3 sec
10240 ~3 sec
15360 ~3 sec
它似乎在缓冲区大小约为 5 mb 时达到饱和点。这有什么特别的原因吗?
面向 c++ 的代码:-
int buffer_size=1024;
ifstream in_file(argv[1]);
char in_buffer[buffer_size];
in_file.rdbuf()->pubsetbuf(in_buffer,sizeof(in_buffer));
ofstream out_file("in");
char out_buffer[buffer_size];
out_file.rdbuf()->pubsetbuf(out_buffer,sizeof(in_buffer));
while(!in_file.eof())
{
char sl[1024];
in_file >> sl;
out_file << sl<<endl;
}
我的测试输入文件是一个 14mb 的文件,有 1000000 行。
Buffer_size Time (~)
10 6.5 sec
100 6.5 sec
1024 6.5 sec
C++ 似乎根本不关心缓冲区大小。为什么?
此外,C++ 代码慢了大约 15 倍(当 C 中的缓冲区大小为 1 mb 时)!ifstream 通常比 FILE 慢(SO上的其他答案似乎表明没有区别)?或者代码中是否还有其他原因导致缓慢?