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

时间:2014-02-21 18:58:36

标签: c++ linux shell unix pipe

如果我想将数据字节传输到Linux上的C / C ++程序,如下所示:

  

cat my_file | ./my_app

但:

  1. 我们不能假设管道数据来自文件
  2. 我们希望将数据解释为文件中的字节(而不是字符串)
  3. 从C / C ++应用程序中读取管道的最快技术是什么?

    我做了一点研究,发现:

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

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

    编辑:对此的性能要求,因此我要求开发最小的技术。

2 个答案:

答案 0 :(得分:4)

为什么你更关心性能呢?来自/dev/urandom的1千兆字节可以在1分钟内传输到wcwc正在运行15%的时间,等待其余数据的数据!试试time (head -1000000000c /dev/urandom|wc)

但最快的方法是使用read(2)系统调用具有相当大的缓冲区(例如64K字节到256K字节)。

但我敢打赌,在实践中使用popenstdin,或从std::cin阅读不会增加很多开销。

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

另见this question

(如果您从 stdin 读取文件描述符为STDIN_FILENO,则为0)

答案 1 :(得分:2)

当你像这样管道数据时,管道输入标准输入。只需从正常的控制台程序中读取cin(或stdin)。

只需使用std::cin.read()即可。没有理由处理popen()或其同类。


只是为了澄清......没有特定于管道的方式来读取输入。就你的程序而言,有cin就是这样。

这个问题可能会帮助你摆脱速度方面的问题...... Why is reading lines from stdin much slower in C++ than Python?