gpt4 book ai didi

c++ - 为什么 endl 被用作 "\n"的同义词,即使它会导致显着的性能损失?

转载 作者:可可西里 更新时间:2023-11-01 16:54:40 26 4
gpt4 key购买 nike

这个程序:

#include <iostream>
#include <cstdlib>
#include <string>

int main(int argc, const char *argv[])
{
using ::std::cerr;
using ::std::cout;
using ::std::endl;

if (argc < 2 || argc > 3) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
unsigned long count = 10000;
if (argc > 2) {
char *endptr = 0;
count = ::std::strtoul(argv[1], &endptr, 10);
if ((argv[1][0] == '\0') || (*endptr != '\0')) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
}
const ::std::string msg((argc < 3) ? argv[1] : argv[2]);
for (unsigned long i = 0; i < count; ++i) {
cout << i << ": " << msg << '\n';
}
return 0;
}

像这样计时的时候:

$ time ./joe 10000000 fred >/dev/null

real 0m15.410s
user 0m10.551s
sys 0m0.166s

需要 15.4 秒的实时执行时间。将输出行替换为:cout << i << ": " << msg << endl;你最终会得到这样的结果:

$ time ./joe 10000000 fred >/dev/null

real 0m39.115s
user 0m16.482s
sys 0m15.803s

如您所见,运行时间增加了一倍以上,程序从在操作系统中花费最少的时间到在操作系统中花费近一半的时间。

程序的两个版本具有相同的输出,并且由标准保证在每个平台上具有相同的输出。

鉴于此,为什么人们坚持使用 endl作为 '\n'? 的同义词

编辑:如果不是很明显,这个问题旨在成为一个引导性问题,并用于指导目的。我知道为什么存在性能损失。

最佳答案

我不确定。将 std::endl 插入输出流被定义为等效于插入 .widen('\n') 然后调用 flush() 但许多程序员坚持使用 std::endl,即使没有刷新的原因,例如他们继续立即输出其他内容。

我的假设是它来自于一种错误的信念,即它在某种程度上更便携,因为它没有明确使用特定的换行符。这是不正确的,因为流库必须始终将 \n 映射到系统对非二进制文件的正确换行序列。

关于c++ - 为什么 endl 被用作 "\n"的同义词,即使它会导致显着的性能损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2122986/

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