我想知道将新线路输出到控制台的效率最高的方法是什么。请解释为什么一种技术更有效。在性能方面有效。
例如:
cout << endl;
cout << "\n";
puts("");
printf("\n");
这个问题的动机是我发现自己用输出编写循环,我需要在循环的所有迭代后输出一个新行。假设没有其他问题,我试图找出最有效的方法。没有其他重要的假设可能是错误的。
答案 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
。stdout
和std::cout
默认情况下正式同步(例如,查找std::ios_base::sync_with_stdio
)以允许将输出混合到stdout
和std::cout
(同样适用于stderr
和std::cerr
)以上只是一个选择,但有许多因素可以决定可能被视为或多或少的表现。
答案 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),否则您将遇到错误。最后一行只有一个';“只是一个分号。