gpt4 book ai didi

c++ - std::cin 真的很慢

转载 作者:太空狗 更新时间:2023-10-29 19:39:43 25 4
gpt4 key购买 nike

所以我试图为自己编写一个 linux 管道命令。将其视为 gnu“cat”或“sed”的复制品,从 stdin 获取输入,进行一些处理并写入 stdout。

我最初编写了一个 AWK 脚本,但想要更高的性能,所以我使用了以下 C++ 代码:

std::string crtLine;
crtLine.reserve(1000);
while (true)
{
std::getline(std::cin, crtLine);
if (!std::cin) // failbit (EOF immediately found) or badbit (I/O error)
break;

std::cout << crtLine << "\n";
}

这正是 cat 所做的(没有任何参数)。事实证明,这个程序和它的 awk 对应程序一样慢,但远不及 cat 快。

在 1GB 的文件上测试:

$time cat 'file' | cat | wc -l
real 0m0.771s

$time cat 'file' | filter-range.sh | wc -l
real 0m44.267s

我尝试使用 cin.getline(buffer, size) 而不是 getline(istream, string) 但没有任何改进。这很尴尬,是缓冲问题吗?我还尝试一次获取 100KB 而不是一行,没有帮助!有什么想法吗?

编辑:你们说的有道理,但罪魁祸首不是字符串构建/复制,也不是扫描换行符。 (缓冲区的大小也不是)。看看这两个程序:

char buf[200];
while (fgets(buf, 200, stdin))
std::cout << buf;

$time cat 'file' | ./FilterRange > /dev/null
real 0m3.276s




char buf[200];
while (std::cin.getline(buf, 200))
std::cout << buf << "\n";

$time cat 'file' | ./FilterRange > /dev/null
real 0m55.031s

它们都不操作字符串,并且都进行换行扫描,但是一个比另一个慢 17 倍。它们的区别仅在于 cin 的使用。我认为我们可以有把握地得出结论,cin 搞砸了时间。

最佳答案

要获得标准 I/O 流对象的良好性能,您要做的第一事情是关闭与标准 C 流对象的同步:

std::ios_base::sync_with_stdio(false);

完成此操作后,您应该会获得更好的性能。不过,您是否获得良好的表现是一个不同的问题。

由于有些人声称 cat 会在里面做什么很有趣,下面是将一个流复制到另一个流的最快方法:

std::cout << std::cin.rdbuf();

如果你能正确地 std::copy() 一个流到另一个流,我会很高兴,但这对大多数 I/O 流实现来说效果不太好:

std::copy(std::istreambuf_iterator<char>(std::cin), std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(std::cout));

我希望我最终能成为最好的...

关于c++ - std::cin 真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025093/

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