在使用cout时,通常使用std :: endl打印换行符。对于具有很少I / O操作的小型程序,这种做法是可以接受的,但是如果I / O操作的数量增加了,那么程序的效率就会受到影响。
std :: endl不仅会在流中添加换行符,还会在每次使用缓冲区时刷新缓冲区,因此在我们编写时
cout << std::endl
我们实际上正在做这样的事情
cout << '\n' << std::flush;
刷新缓冲区是一项操作系统任务。每次刷新缓冲区时,都必须向OS发出请求,并且这些请求比较昂贵。此外,我们实际上不需要每次向流中写入内容时都刷新缓冲区,因为缓冲区满时会自动刷新。在极少数情况下,我们确实需要执行刷新,我们可以使用cout.flush()或通过将std :: flush插入流中来显式指定操作。
将’\ n’字符直接写入流更有效,因为它不会像std :: endl那样强制刷新。
表现对绩效的影响
以下C++程序演示了std :: endl的性能影响。我们一次使用std :: endl将100000个字符串写入两个文件,然后再次使用’\ n’。在每种情况下,我们都会测量执行时间并打印这些时间
#include
#include
#include
using namespace std;
using namespace std::chrono;
int main()
{
ofstream file1("file1.txt");
ofstream file2("file2.txt");
// Write to file1 using endl
// To measure execution time in C++
// refer to this article
// https://www.geeksforgeeks.org/measure-execution-time-function-cpp/
auto start = high_resolution_clock::now();
for ( int i = 0; i < 100000; i++) {
file1 << "Hello World " << std::endl ;
}
auto stop = high_resolution_clock::now();
auto duration = duration_cast(stop-start);
cout << "Writing to file using endl took "
<< duration.count() << " microseconds" << std::endl;
// Write to file2 using \n
start = high_resolution_clock::now();
for ( int i = 0; i < 100000; i++) {
file2 << "Hello World \n" ;
}
stop = high_resolution_clock::now();
duration = duration_cast(stop-start);
cout << "Writing to file using \\n took "
<< duration.count() << " microseconds"<< std::endl;
file1.close();
file2.close();
return 0;
}
输出:(取决于机器)
Writing to file using endl took 3272 microseconds
Writing to file using \n took 1533 microseconds
从输出std :: endl可以看到,时间花费了将近一倍。在某些系统上,性能影响可能会更糟。请注意,与直接将’\ n’直接打印到流中相比,可以确保std :: endl花费更多的时间。
参考:
C++每周–第7集
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。