Кто быстрее: 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

Комментарии