200,000 回印刷しようとしましたHello World
が、永遠にかかるので、やめなければなりません。しかし、char
バッファとして機能する配列を追加した直後は、10 秒もかかりませんでした。なぜでしょうか?
バッファを追加する前に:
#include <iostream>
using namespace std;
int main() {
int count = 0;
std::ios_base::sync_with_stdio(false);
for(int i = 1; i < 200000; i++)
{
cout << "Hello world!\n";
count++;
}
cout<<"Count:%d\n"<<count;
return 0;
}
バッファを追加した後は次のようになります。
#include <iostream>
using namespace std;
int main() {
int count = 0;
std::ios_base::sync_with_stdio(false);
char buffer[1024];
cout.rdbuf()->pubsetbuf(buffer, 1024);
for(int i = 1; i < 200000; i++)
{
cout << "Hello world!\n";
count++;
}
cout<<"Count:%d\n"<<count;
return 0;
}
これは Java について考えさせます。BufferReader を使用してファイルを読み込む利点は何でしょうか?
ベストアンサー1
ファイル操作に関しては、メモリ (RAM) に書き込む方が、ディスク上のファイルに直接書き込むよりも常に高速です。
説明のために、次のように定義します。
- ディスク上のファイルへの書き込みIO操作には1ミリ秒かかります。
- ネットワーク経由でディスク上のファイルへの書き込みIO操作には5ミリ秒かかります。
- メモリへの書き込みIO操作ごとに0.5ミリ秒かかります
あるデータをファイルに 100 回書き込む必要があるとします。
ケース 1: ディスク上のファイルに直接書き込む
100 times x 1 ms = 100 ms
ケース 2: ネットワーク経由でディスク上のファイルに直接書き込む
100 times x 5 ms = 500 ms
ケース3: ディスク上のファイルに書き込む前にメモリにバッファリングする
(100 times x 0.5 ms) + 1 ms = 51 ms
ケース 4: ネットワーク経由でディスク上のファイルに書き込む前にメモリにバッファリングする
(100 times x 0.5 ms) + 5 ms = 55 ms
結論
メモリ内のバッファリングは直接操作よりも常に高速です。ただし、システムのメモリが少なく、ページ ファイルとスワップする必要がある場合は、再び速度が低下します。したがって、メモリとディスク/ネットワークの間で IO 操作のバランスを取る必要があります。