gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:05 24 4
gpt4 key购买 nike

如果我想像这样将数据字节通过管道传输到 Linux 上的 C/C++ 程序中:

cat my_file | ./my_app

但是:

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

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

我做了一些研究,发现:

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

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

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

最佳答案

为什么您如此关心性能?

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

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

当然要读Advanced Linux Programming并仔细syscalls(2)相关的 man 页面。

Linux kernel

学习灵感源码 , 属于 GNU libc , 属于 musl-libc .他们都是open source项目,所以请随时为它们做贡献并改进它们。

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

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

另见 this question .

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

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

您当然应该阅读 GCC 的文档和 this draft报告。

你可以使用machine learning性能优化技术。

查看 MILEPOST GCCCtuning项目。考虑加入RefPerSys一。当然要读Understanding machine learning: From theory to algorithms书号 978-1-107-05713-5

关于c++ - 从 C/C++ 程序读取管道的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com