C++ 从C/C+;读取管道的最快方法+;节目?
如果我想在Linux上通过管道将字节数据传输到C/C++程序,如下所示: cat my|u文件|/my|u应用程序 但是:C++ 从C/C+;读取管道的最快方法+;节目?,c++,linux,shell,unix,pipe,C++,Linux,Shell,Unix,Pipe,如果我想在Linux上通过管道将字节数据传输到C/C++程序,如下所示: cat my|u文件|/my|u应用程序 但是: 我们不能假设管道数据将来自文件 我们希望将数据解释为文件中的字节(而不是字符串) 从C/C++应用程序读取管道的最快技术是什么 我做了一些研究,发现: read() std::cin.read() popen() 但我不确定是否有更好的方法,或者上面哪种方法更好 编辑:在这方面有一个性能要求,因此我要求使用开销最小的技术。当您这样导入数据时,管道输入是标准输入。就像普通
read()
std::cin.read()
popen()
编辑:在这方面有一个性能要求,因此我要求使用开销最小的技术。当您这样导入数据时,管道输入是标准输入。就像普通的控制台程序一样,只需读取cin(或stdin) 只需使用
std::cin.read()
。没有理由处理popen()
或类似的问题
只是想澄清一下。。。没有特定于管道的方式来读取输入。就你的计划而言,有cin,就这样 这个问题可能会在速度方面帮助你。。。 您为什么那么关心性能? 来自
/dev/uradom
的1G字节可以在1分钟内通过管道传输到wc
(并且wc
在15%的时间内运行,等待其余时间的数据)!只要试试时间(head-1000000000c/dev/uradom|wc)
但最快的方法是使用具有相当大缓冲区(例如64KB到256KB)的系统调用
当然,请阅读并仔细阅读相关的man
页面
研究灵感的源代码。它们都是项目,因此请随时为它们做出贡献并加以改进
但我敢打赌,在实践中使用popen
,或stdin
,或读取std::cin
不会增加太多开销
您还可以使用增加stdio缓冲区
另见
(如果从stdin读取,则文件描述符为stdin\u FILENO
,即0)
你可能对
您当然应该阅读和报告的文档
您可以使用技术来优化性能。
调查项目的进展情况。考虑加入其中一个。Read当然是ISBN 978-1-107-05713-5注意
popen()
不会从管道中读取任何内容,只会提供必要的文件描述符,您可以使用这些描述符调用Read()
。而不是popen()
。在C语言中,使用read()
;在C++中,可能是“代码> Read())/Cudio >,但是使用<代码> STD::CIN < /C>也会起作用。在shell中使用|
并读取std::cin
将非常好、灵活和健壮。仅供参考,cat my_file./my_app
比/my_app@CharlesDuffy慢只是我的误解,认为有两种方法,一种更快…这必须在编写时考虑到高性能-这就是为什么我问什么是开销最小的方法?最小化开销非常依赖于具体情况——有时标准库提供的缓冲有助于解决问题,有时会带来伤害。我不知道你能得到一个总是正确的通用答案;除了使用STD::CI::Read()之外,还有什么其他的可能要我去测试?嗯,代码> STD::CIN::()(代码)<代码>是C++方式。还有C标准库调用和操作系统系统调用的直接调用。您的操作系统和标准库通常会提供许多用于调优的标志。但是,除非您已经测量到足够多,知道自己有问题,并且知道是读取过程导致了问题,否则您为什么要从以下内容开始呢?:)我可以问一下,如何获取第二个参数的文件描述符?抱歉,最后一个问题-我将用您建议的系统调用read()替换我的std::cin.read()。然而,我也有一个while循环检查!std::cin.eof(),以便获取所有字节。要了解read()系统调用的全部好处,有没有一种方法可以替代while(!std::cin.eof())的检查?我不明白您为什么那么关心性能。但是请阅读阅读(2)
的手册页。你的申请是什么?请编辑您的问题以说明更多信息。@user997112,对于同一个文件描述符,不要混合使用缓冲调用和非缓冲调用——如果您使用的是read()
(非缓冲),则不应使用任何std::cin
调用。