我有两个程序通过 linux 管道(命名或其他方式)相互传递数据。我需要在两个程序之间达到 ~2600 MB/s 的传输速率,但目前看到的传输速率较慢,约为 ~2200 MB/s。但是,我发现如果我用 'dd' 替换我的第二个进程,传输速率会跃升至超过 3000 MB/s。我的程序从管道读取的方式是否比“dd”的方式效率低?我可以做些什么来提高这个吞吐量?'ifstream' 本质上是否比从管道读取二进制数据的其他方法慢?
总结一下这两种情况:
场景一:
程序 1 -> [命名管道] -> 程序 2
产生约 2200 MB/s 的传输速率
场景2:
程序 1 -> [命名管道] -> 'dd if=pipename of=/dev/null bs=8M'
产生约 3000 MB/s 的传输 速率。
这是我的程序 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
}
更新:
我现在尝试使用 'read(fd, &buffer[0], 8*1024*1024)' 而不是 istream,似乎有轻微的改善(但不如 dd)
我还尝试使用 stream->rdbuf()->sgetn(&buffer[0], 8*1024*1024) 而不是 stream->read(),但没有帮助。