Почему нам следует избегать использования std :: endl

Опубликовано: 31 Декабря, 2021

Обычной практикой является использование std :: endl для печати новой строки при использовании cout. Для небольших программ с очень небольшим количеством операций ввода-вывода такая практика приемлема, но если большая часть операций ввода-вывода увеличивается, эффективность программы снижается.

std :: endl не только добавляет в поток новые строки, но и очищает буфер каждый раз, когда он используется.

 cout << std :: endl

Мы действительно делаем что-то вроде этого

 cout << ' n' << std :: flush;

Очистка буферов - это задача операционной системы. Каждый раз, когда буфер очищается, необходимо сделать запрос к ОС, и эти запросы сравнительно дороги. Кроме того, нам действительно не нужно очищать буфер каждый раз, когда мы что-то записываем в поток, поскольку буферы очищаются автоматически, когда они заполняются. В редких случаях, когда нам действительно нужно выполнить сброс, мы можем явно указать операцию, используя либо cout.flush (), либо вставив std :: flush в поток.

Запись символов ' n' непосредственно в поток более эффективна, поскольку не вызывает сброса, как std :: endl.

Демонстрация влияния на производительность
Следующая программа на C ++ демонстрирует влияние std :: endl на производительность. Мы записываем 100000 строк в два файла один раз, используя std :: endl, а затем снова используя ' n'. В каждом случае мы измеряем затраченное время на выполнение и выводим это время.

#include <iostream>
#include <chrono>
#include <fstream>
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
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<microseconds>(stop-start);
cout << "Writing to file using endl took "
<< duration.count() << " microseconds" << std::endl;
// Write to file2 using
start = high_resolution_clock::now();
for ( int i = 0; i < 100000; i++) {
file2 << "Hello World " ;
}
stop = high_resolution_clock::now();
duration = duration_cast<microseconds>(stop-start);
cout << "Writing to file using \n took "
<< duration.count() << " microseconds" << std::endl;
file1.close();
file2.close();
return 0;
}

Выход: (Зависит от машины)

Запись в файл с использованием endl заняла 3272 микросекунды.
Запись в файл с использованием  n заняла 1533 микросекунды.

Как видно из вывода, std :: endl заняло почти вдвое больше времени. В некоторых системах влияние на производительность может быть еще хуже. Обратите внимание, что гарантировано, что std :: endl займет больше времени, чем печать n непосредственно в поток.

Использованная литература:
Еженедельник C ++ - Эпизод 7

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
C++