Почему нам следует избегать использования std :: endl
Обычной практикой является использование 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