从 C/C++ 程序读取管道的最快方法?

use*_*112 0 c++ unix linux shell pipe

如果我想通过管道将数据字节输入 Linux 上的 C/C++ 程序,如下所示:

cat my_file | ./my_app

但:

  1. 我们不能假设管道数据将来自文件
  2. 我们希望将数据解释为文件中的字节(而不是字符串)

从 C/C++ 应用程序读取管道的最快技术是什么?

我做了一点研究,发现:

  • read()
  • std::cin.read()
  • popen()

但我不确定是否有更好的方法,或者以上哪种方法更好。

编辑:对此有性能要求,因此我要求使用开销最小的技术。

Bas*_*tch 5

你为什么那么关心性能?

/dev/urandom可以wc在 1 分钟内通过管道传输1 GB (并且wc15% 的时间正在运行,等待其余数据)!你试一试time (head -1000000000c /dev/urandom|wc)

但最快的方法是使用read(2)系统调用和一个相当大的缓冲区(例如 64Kbytes 到 256Kbytes)。

当然,请阅读Advanced Linux Programming并仔细阅读syscalls(2)相关man页面。

研究Linux 内核GNU libcmusl-libc的源代码获取灵感。它们都是开源项目,因此请随时为它们做出贡献并改进它们。

但我敢打赌,在实践中使用popen、 或stdin或读取std::cin不会增加太多开销。

您还可以使用setvbuf(3)增加stdio缓冲区。

另请参阅此问题

(如果你从stdin读取文件描述符STDIN_FILENO是 0)

您可能对time(7)vdso(7)syscalls(2)感兴趣

您当然应该阅读GCC 的文档和这份报告草案

您可以使用机器学习技术来优化性能。

查看MILEPOST GCCCtuning项目。考虑加入RefPerSys之一。阅读课程理解机器学习:从理论到算法ISBN 978-1-107-05713-5