为什么 endl 被用作“\n”的同义词,尽管它会带来严重的性能损失?

2023-11-26

这个程序:

#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'?

Edit:如果它不明显,这个问题旨在成为一个引导性问题,并且出于教学目的。我知道为什么存在性能损失。


我不确定。插入std::endl到输出流中被定义为相当于插入.widen('\n')然后打电话flush()然而许多程序员坚持使用std::endl即使没有原因刷新,例如,它们也会立即输出其他内容。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 endl 被用作“\n”的同义词,尽管它会带来严重的性能损失? 的相关文章

随机推荐