📜  为什么我们应该避免使用std :: endl

📅  最后修改于: 2021-05-30 19:34:24             🧑  作者: Mango

在使用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等的更多准备工作,请参阅“完整面试准备课程”