Почему 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'?

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

8
задан Omnifarious 8 February 2011 в 12:34
поделиться

6 ответов

Я не уверен. Вставка std :: endl в выходной поток определяется как эквивалентное для вставки .widen ('\ N') , а затем вызов sthume () Многие программисты сохраняются в использовании std :: endl , даже когда нет причина, например, они продолжают немедленно выводить что-то еще.

Мое предположение состоит в том, что он исходит от неверной веры в то, что он как-то более портативно, потому что он явно не использует определенный символ Newline. Это неверно, как \ N , всегда следует сопоставлять с правильной последовательностью новой линии для невоиковых файлов по библиотеке потока.

21
ответ дан 3 November 2019 в 13:09
поделиться

afaik, EndL также смывает поток, который может быть причиной штрафа производительности.

4
ответ дан 3 November 2019 в 13:09
поделиться

Не все так много заботятся о производительности. Для некоторых приложений, гарантируя поток, намного важнее.

Редактировать: Также я нахожу EndL Проще ввести тип '\ N' : -)

4
ответ дан 3 November 2019 в 13:09
поделиться

Я склонен использовать EndL на StringStreams, так как это позволяет легко обнаружить недостающие линии.

2
ответ дан 3 November 2019 в 13:09
поделиться

Я предполагает, что использование учебных текстов STD :: Endl с убеждением, что он проще и менее запутанный для начинающих, а потом люди привыкли использовать его.

2
ответ дан 3 November 2019 в 13:09
поделиться
-

Реальный вопрос в том, почему компилятор делал такие собаки завтрак на компиляции версии ENDL? Если они гарантированно имеют такую ​​же семантику, то они также должны иметь одинаковое время выполнения.

Редактировать: Очевидно, я не знал, что endl промыл ручей ... вот что вы получаете за то, что вы не смотрите.

0
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: