输出换行符最有效的方法

时间:2016-05-13 19:33:26

标签: c++

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

例如:

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

这个问题的动机是我发现自己用输出编写循环,我需要在循环的所有迭代后输出一个新行。假设没有其他问题,我试图找出最有效的方法。没有其他重要的假设可能是错误的。

7 个答案:

答案 0 :(得分:11)

putchar('\n')是最简单的,可能是最快的。字符cout的{​​{1}}和printf使用空终止字符串,因为处理2个字节(0A 00),所以速度较慢。顺便说一下,回车是"\n" = 13(0x0D)。 \r代码是换行符(LF)。

答案 1 :(得分:6)

您没有指定是否要求立即更新屏幕或推迟到下一次刷新。因此:

如果你正在使用iostream io:

cout.put('\n');

如果你正在使用stdio io:

std::putchar('\n');

答案 2 :(得分:4)

它实际上取决于OS /编译器实现。

输出'\n'换行符的最有效,最少副作用保证方法是使用std::ostream::write()(对于某些系统,需要std::ostream打开在std::ios_base::binary模式下):

static const char newline = '\n';
std::cout.write(&newline,sizeof(newline));

答案 3 :(得分:3)

在Ubuntu 15.10,g ++ v5.2.1(以及旧的vxWorks和OSE)

很容易证明

std::cout << std::endl;

将新行char放入输出缓冲区,然后将缓冲区刷新到设备。

但是

std::cout << "\n";

将新行char放入输出缓冲区,而不输出到设备。将需要一些未来的操作来触发缓冲区中换行符的输出到设备。

两个这样的行动是:

std::cout << std::flush;  // will output the buffer'd new line char

std::cout << std::endl;   // will output 2 new line chars

还有一些其他操作可以触发刷新std :: cout缓冲。

#include <unistd.h>  // for Linux
void msDelay (int ms) { usleep(ms * 1000); }

int main(int, char**)
{
   std::cout << "with endl and no delay " << std::endl;

   std::cout << "with newline and 3 sec delay " << std::flush << "\n";
   msDelay(3000);

   std::cout << std::endl << " 2 newlines";
   return(0);
}

而且,根据知道的人的评论(对不起,我不知道如何在这里复制他的名字),某些环境也有例外。

答案 4 :(得分:2)

我建议使用:

std::cout << '\n';  /* Use std::ios_base::sync_with_stdio(false) if applicable */

fputc('\n', stdout);

然后打开优化,让编译器决定做这项琐碎工作的最佳方法。

答案 5 :(得分:2)

这个问题的答案实际上是“它取决于”。

孤立地 - 如果您所测量的是将'\n'字符写入标准输出设备的性能,而不是调整设备,而不是改变发生的缓冲 - 那么就很难打败像

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

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

问题是这没有达到太多 - 它所做的一切(假设输出是屏幕或可见的应用程序窗口)是将光标向下移动到屏幕上,并向上移动前一个输出。对于您的程序用户而言,这并不是一种有趣或有价值的体验。所以你不会孤立地做这件事。

但是,如果我们不单独输出换行符,那会影响性能(但是你衡量的是)?我们来看看;

  • 默认情况下会缓存stdout(或std::cout)的输出。要使输出可见,选项包括关闭缓冲或使代码定期刷新缓冲区。也可以使用stderr(或std::cerr),因为默认情况下不会缓冲它 - 假设stderr也指向控制台,输出到它具有相同的性能特征stdout
  • stdoutstd::cout默认情况下正式同步(例如,查找std::ios_base::sync_with_stdio)以允许将输出混合到stdoutstd::cout(同样适用于stderrstd::cerr
  • 如果你的代码输出的不仅仅是一组换行符,那么就有处理(通过任何方式访问或读取输出所依据的数据)来产生那些其他输出,输出函数的处理等等。
  • 有不同的绩效衡量标准,因此有不同的提高效率的方法。例如,可能存在CPU周期,控制台上显示输出的总时间,内存使用情况等等
  • 控制台可能是物理屏幕,它可能是应用程序创建的窗口(例如,托管在X,windows中)。性能将受到硬件选择,窗口/ GUI子系统的实现,操作系统等的影响。

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

答案 6 :(得分:0)

好吧,如果您想更改行,我想添加使用(endl)的最简单,最常用的方法

示例:

     cout<<"So i want a new line"<<endl;
     cout<<"Here is your new line";

输出:

       So i want a new line
       Here is your new line

您可以根据需要添加尽可能多的新行。请允许我用两个新行来显示示例,它肯定会清除您的所有疑问,

示例:

         cout<<"This is the first line"<<endl;
         cout<<"This is the second line"<<enld;
         cout<<"This is the third line";

输出:

   This is the first line
   This is the second line
   This is the third line

请记住,最后一行不应包含(endl),否则您将遇到错误。最后一行只有一个';“只是一个分号。