Кто быстрее: std::endl или "\n"?
До сегодняшнего дня я свято верил, что в потоках std::endl – это всегда правильнее, чем \n. Переносимость, и все такое. Но, увы.
Код с std::endl:
#include <string>
#include <iostream>
int main() {
for (int i = 0; i < 1000000; ++i) {
std::string s(1, 'x');
std::cout << s << std::endl;
}
return 0;
}
Компилируем и запускаем:
clang++ -o endl -O3 endl.cpp && time ./endl >rubbish
real 0m4.518s
user 0m1.080s
sys 0m3.311s
Код с \n:
#include <string>
#include <iostream>
int main() {
for (int i = 0; i < 1000000; ++i) {
std::string s(1, 'x');
std::cout << s << '\n';
}
return 0;
}
Компилируем и запускаем:
clang++ -o endl -O3 endl.cpp && time ./endl >rubbish
real 0m0.263s
user 0m0.236s
sys 0m0.008s
Разница очевидна.
std::endl всегда flushит поток, сбрасывая буфера. \n же просто пихает в поток символ начала новой строки, и большинстве случаев это и требуется. А когда надо, можно отдельно вызвать std::flush, один раз.
Disclaimer