Linuxパイプ(名前付きまたはその他)を介して互いにデータを渡す2つのプログラムがあります。2 つのプログラム間で ~2600 MB/s の転送速度を達成する必要がありますが、現在、約 ~2200 MB/s の遅い速度が見られます。ただし、2 番目のプロセスを代わりに「dd」に置き換えると、転送速度が 3000 MB/s を超えることがわかりました。私のプログラムがパイプから読み取る方法について、「dd」の方法よりも効率が悪いものはありますか? このスループットを改善するにはどうすればよいですか? 「ifstream」は、パイプからバイナリデータを読み取る他の方法よりも本質的に遅いですか?
2 つのシナリオを要約すると、次のようになります。
シナリオ 1:
プログラム 1 -> [名前付きパイプ] -> プログラム 2
~2200 MB/秒の転送速度を実現
シナリオ 2:
プログラム 1 -> [名前付きパイプ] -> 'dd if=pipename of=/dev/null bs=8M'
~3000 MB/秒の転送 速度が得られます。
私のプログラム2が現在パイプから読み取る方法は次のとおりです。
ifstream inputFile;
inputFile.open(inputFileName.c_str(), ios::in | ios::binary);
while (keepLooping)
{
inputFile.read(&buffer[0], 8*1024*1024);
bytesRead = inputFile.gcount();
//Do something with data
}
アップデート:
istream の代わりに 'read(fd, &buffer[0], 8*1024*1024)' を使用してみましたが、軽度の改善が見られました (ただし、dd ほどではありません)
また、stream->read() の代わりに stream->rdbuf()->sgetn(&buffer[0], 8*1024*1024) を使用してみましたが、役に立ちませんでした。