Почему endl используется в качестве синонима для «\ n», хотя это приводит к значительным потерям производительности?

Эта программа:

#include <iostream>
#include <cstdlib>
#include <string>

int main(int argc, const char *argv[])
{
   using ::std::cerr;
   using ::std::cout;
   using ::std::endl;

   if (argc < 2 || argc > 3) {
      cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
      return 1;
   }
   unsigned long count = 10000;
   if (argc > 2) {
      char *endptr = 0;
      count = ::std::strtoul(argv[1], &endptr, 10);
      if ((argv[1][0] == '\0') || (*endptr != '\0')) {
         cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
         return 1;
      }
   }
   const ::std::string msg((argc < 3) ? argv[1] : argv[2]);
   for (unsigned long i = 0; i < count; ++i) {
      cout << i << ": " << msg << '\n';
   }
   return 0;
}

когда рассчитано так:

$ time ./joe 10000000 fred >/dev/null

real  0m15.410s
user  0m10.551s
sys   0m0.166s

выполнение 15,4 секунд реального времени. Замените строку вывода на это:cout << i << ": " << msg << endl; и вы получите что-то вроде этого:

$ time ./joe 10000000 fred >/dev/null

real  0m39.115s
user  0m16.482s
sys   0m15.803s

Как видите, время запуска более чем удваивается, и программа переходит от того, чтобы тратить минимальное количество времени на ОС, и тратить почти половину своего времени на работу в ОС.

Обе версии программы имеют идентичный вывод, и в соответствии со стандартом гарантируют одинаковый вывод на каждой платформе.

Учитывая это, почему люди продолжают использоватьendl как синоним'\n'?

Редактировать: В случае, если это не очевидно, этот вопрос предназначен, чтобы быть ведущим вопросом и здесь для учебных целей. Я знаю, почему существует потеря производительности.

Ответы на вопрос(6)

Ваш ответ на вопрос