Эта программа:
#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'?
Править: В случае, если это не очевидно, этот вопрос предназначается, чтобы быть наводящим вопросом и здесь в учебных целях. Я знаю, почему потеря производительности существует.
Я не уверен. Вставка std :: endl
в выходной поток определяется как эквивалентное для вставки .widen ('\ N')
, а затем вызов sthume ()
Многие программисты сохраняются в использовании std :: endl
, даже когда нет причина, например, они продолжают немедленно выводить что-то еще.
Мое предположение состоит в том, что он исходит от неверной веры в то, что он как-то более портативно, потому что он явно не использует определенный символ Newline. Это неверно, как \ N
, всегда следует сопоставлять с правильной последовательностью новой линии для невоиковых файлов по библиотеке потока.
afaik, EndL также смывает поток, который может быть причиной штрафа производительности.
Не все так много заботятся о производительности. Для некоторых приложений, гарантируя поток, намного важнее.
Редактировать: Также я нахожу EndL
Проще ввести тип '\ N'
: -)
Я склонен использовать EndL на StringStreams, так как это позволяет легко обнаружить недостающие линии.
Я предполагает, что использование учебных текстов
STD :: Endl
с убеждением, что он проще и менее запутанный для начинающих, а потом люди привыкли использовать его.
Реальный вопрос в том, почему компилятор делал такие собаки завтрак на компиляции версии ENDL? Если они гарантированно имеют такую же семантику, то они также должны иметь одинаковое время выполнения.
Редактировать: Очевидно, я не знал, что endl промыл ручей ... вот что вы получаете за то, что вы не смотрите.