それはすべてこの質問から始まりました->ファイルからデータのブロックを読み取り、そのブロックからベクターに読み取る方法は?
ディスク I/O 操作を最小限に抑える目的で、いくつかの実験を行って、バッファーのサイズがプログラムの所要時間に何らかの影響を与えるかどうかを確認しました。
次の 2 つのコードを使用しました。1 つは C 指向で、もう 1 つは 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;
}
私のテスト入力ファイルは、1000000 行の 14MB ファイルでした。
Buffer_size Time (~)
10 6.5 sec
100 6.5 sec
1024 6.5 sec
C++ はバッファ サイズをまったく気にしていないようです。なんで?
また、C++ コードは約 15 倍遅くなります (C のバッファー サイズが 1 mb の場合)。通常、ifstream は FILE よりも遅いですか (SO に関する他の回答は、違いがないことを示唆しているようです)。または、速度低下の原因となっているコードが他にあるのでしょうか?