Стандартно ли стандартная производительность C ++ для iostreams, или я просто имею дело с плохой реализацией?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Стандартно ли стандартная производительность C ++ для iostreams, или я просто имею дело с плохой реализацией?

Сообщение Anonymous »

Каждый раз, когда я упоминаю медленную производительность стандартной библиотеки C ++ Iostreams, меня встречаются с волной неверия. Тем не менее, у меня есть результаты профилировщика, показывающие большое количество времени, проведенного в коде библиотеки iostream (полная оптимизация компилятора), и переключение от iostreams на OS-специфические API ввода /вывода и пользовательское управление буферами дает порядок улучшения масштаба. Или некоторые компиляторы предоставляют реализации iostreams, которые конкурентоспособны с ручным управлением буфером? ostringstream http://ideone.com/2ppyw
[*] Поместите двоичные данные в char [] буфер http://ideone.com/ni5ct
[*] Поместите бинальные данные в вектор , используя back_inserter code

on ideone (gcc-4.3.4, неизвестная ОС и аппаратное обеспечение): < /p>


[*]ostringstream[/code]: 53 миллисекунд
[*]

Код: Выделить всё

stringbuf
: 27 мс
[*] и back_inserter : 17,6 мс
[*] с обычным итератором: 10,6 мс
[*] Итератор и проверка границ: 11,4 мс
[*]

Код: Выделить всё

char[]< /code>: 3,7 мс < /li>
< /ul>

на моем ноутбуке (Visual C ++ 2010 x86, Cl /Ox /Ehsc < /code>, Windows 7 Ultimate 64-Bit, Intel Core i7, 8 ГБ ОЗУ): < /p>



< /ul>

Visual C ++ 2010 x86, с оптимизацией с профилем Cl /Ox /EHSC /GL /C < /code>, Link /LTCG: pgi < /code>, run, link /ltcg: pgo < /code>, cearm: < /br /pgi < /code>, run, link /ltcg: pgo < /cod>: < /pgi < /code>, run, link /ltcg: pgo < /code>.  /> 
ostringstream
: 61,2 мс, 60,5 мс
[*]

Код: Выделить всё

vector< /code> с обычным итератором: 1,04 мс, 1,03 мс < /li>
< /ul>

тот же ноутбук, тот же ОС, используя Cygwin GCC 4.3.4 g ++ -O3 < /code>: < /p>


: 3,57 мс, 3,75 мс < /li>
< /ul>

тот же ноутбук, визуальный C ++ 2008 Sp1, Cl /Ox /EHSC < /code>: < /p>


ostringstream
: 88,7 мс, 87,6 мс
[*]

Код: Выделить всё

stringbuf
: 23,3 мс, 23,4 мс
[*] и back_inserter : 26,1 мс, 24,5 мс
[*] с обычным итератором: 3,13 мс, 2,48 мс
[*] Итератор и проверка границ: 2,97 мс, 2,53 мс
[*]

Код: Выделить всё

char[]< /code>: 1,52 мс, 1,25 мс < /li>
< /ul>

тот же ноутбук, визуальный C ++ 2010 64-битный компилятор: < /p>


ostringstream
: 48,6 мс, 45,0 мс
[*]

Код: Выделить всё

stringbuf
: 16,2 мс, 16,0 мс
[*] и back_inserter : 26,3 мс, 26,5 мс
[*] с обычным итератором: 0,87 мс, 0,89 мс
[*] Итератор и проверка границ: 0,99 мс, 0,99 мс

Код: Выделить всё

char[]< /code>: 1,25 мс, 1,24 мс < /li>
< /ul>

Редактировать: запустите все дважды, чтобы увидеть, насколько последовательными были результаты.  Довольно последовательный imo. < /P>

Примечание: на моем ноутбуке, поскольку я могу сэкономить больше времени процессора, чем позволяет ideone, я установил количество итераций на 1000 для всех методов.  Это означает, что ostringstream 
и vector перераспределение, которое происходит только на первом проходе, должны оказать незначительное влияние на конечные результаты. Мне было интересно, как Vector превосходил char [] . Это не имело большого значения, однако, Vector < /code> все еще быстрее, чем char [] < /code> под vc ++ 2010. < /P>

выводы < /h2>

Буперинг вывода требует трех шагов каждый раз, когда данные, incomtrips for. Буферное пространство. < /li>
Скопируйте входящий блок. < /li>
Обновите указатель конец дат. Простая проверка итератора плюс границ «Не только это делает это, но и выделяет дополнительное пространство и перемещает существующие данные, когда входящий блок не подходит. Как указал Клиффорд, буферизацию в классе ввода/вывода файла не придется этого делать, это просто промыло бы текущий буфер и повторно использует его. Так что это должно быть верхней границей на стоимости буферизации, и это будет именно то, что необходимо для того, чтобы это было то, что необходимо для того, чтобы сделать это, и это необходимо. />
Так почему StringBuf < /code> 2,5x медленнее на iDeone и, по крайней мере, в 10 раз медленнее, когда я его тестирует?>

Подробнее здесь: https://stackoverflow.com/questions/434 ... just-deali
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как указать дело одной буквы, игнорируя дело других букв в корпорации?
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как указать дело одной буквы, игнорируя дело других букв в корпорации?
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как завершить чтение/запись в Boost :: iostreams :: multichar_dual_use_filter
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как завершить чтение/запись в Boost :: iostreams :: multichar_dual_use_filter
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Не могу включить C++20 на моем Mac в VSCode. Я обновил существующий файл Tasks.json, чтобы стандартно запускать C++20. Н
    Anonymous » » в форуме C++
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»