如果我想将数据字节传输到Linux上的C / C ++程序,如下所示:
cat my_file | ./my_app
但:
从C / C ++应用程序中读取管道的最快技术是什么?
我做了一点研究,发现:
read()
std::cin.read()
popen()
但我不确定是否有更好的方法,或者上述哪种方式会更好。
编辑:是对此的性能要求,因此我要求开发最小的技术。
答案 0 :(得分:4)
为什么你更关心性能呢?来自/dev/urandom
的1千兆字节可以在1分钟内传输到wc
(wc
正在运行15%的时间,等待其余数据的数据!试试time (head -1000000000c /dev/urandom|wc)
但最快的方法是使用read(2)系统调用具有相当大的缓冲区(例如64K字节到256K字节)。
但我敢打赌,在实践中使用popen
或stdin
,或从std::cin
阅读不会增加很多开销。
您还可以使用setvbuf(3)增加 stdio 缓冲区。
(如果您从 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?