输出换行符的最有效方法

新手上路,请多包涵

我想知道将新行输出到控制台的最有效的性能方式是什么。请解释为什么一种技术更有效。在性能方面高效。

例如:

 cout << endl;
cout << "\n";
puts("");
printf("\n");

这个问题的动机是我发现我的自写循环带有输出,我需要在循环的所有迭代之后输出一个新行。我试图找出什么是最有效的方法来做到这一点,假设没有其他问题。这种认为其他一切都不重要的假设可能是错误的。

原文由 Harrison Tran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 445
2 个回答

这个问题的答案真的是“取决于”。

孤立地-如果您要测量的只是将 '\n' 字符写入标准输出设备的性能,而不是调整设备,不更改缓冲发生的内容-那么很难击败诸如

 putchar('\n');
 fputchar('\n', stdout);

 std::cout.put('\n');

问题是这并没有取得太大的成就——它所做的一切(假设输出到屏幕或可见的应用程序窗口)只是将光标向下移动到屏幕上,然后将先前的输出向上移动。对于您的程序的用户来说,这并不完全是一种有趣或有价值的体验。因此,您不会孤立地执行此操作。

但是,如果我们不单独输出换行符,什么会影响性能(无论您如何衡量)?让我们来看看;

  • stdout (或 std::cout )的输出默认被缓冲。为了使输出可见,选项包括关闭缓冲或让代码定期刷新缓冲区。也可以使用 stderr (或 std::cerr ),因为默认情况下不缓冲 - 假设 stderr 也被定向到控制台,并输出到它具有与 stdout 相同的性能特征。
  • stdout and std::cout are formally synchronised by default (eg look up std::ios_base::sync_with_stdio ) to allow mixing of output to stdout and std::cout (同样适用于 stderrstd::cerr
  • 如果您的代码输出多于一组换行符,则会进行处理(通过任何方式访问或读取输出所基于的数据)以产生其他输出,通过输出函数处理这些输出等。
  • 有不同的绩效衡量标准,因此基于每一项提高效率的方法也不同。例如,可能有 CPU 周期、输出出现在控制台上的总时间、内存使用情况等
  • 控制台可能是物理屏幕,也可能是应用程序创建的窗口(例如托管在 X 中的窗口)。性能将受到硬件选择、窗口/GUI 子系统的实现、操作系统等的影响。

以上只是一个选择,但有许多因素可以决定什么可能被视为或多或少的性能。

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

putchar('\n') 是最简单也可能是最快的。 coutprintf 带字符串 "\n" 使用以空字符结尾的字符串,这会比较慢,因为您处理 2 个字节(0A 00)。顺便说一句,回车是 \r = 13 (0x0D)。 \n 代码是换行(LF)。

原文由 i486 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题