2008-09-17 5 views
24

Я действительно ненавижу использование контейнеров STL, потому что они делают медленную версию моего кода отладки. Что используют другие люди вместо STL, которые имеют разумную производительность для отладочных сборников?STL Alternative

Я программист, и это было проблемой во многих проектах, над которыми я работал. Очень сложно получить 60 кадров в секунду, когда вы используете контейнер STL для всего.

Я использую MSVC для большей части моей работы.

ответ

4

Держу пари, ваш STL использует проверенную реализацию для отладки. Вероятно, это хорошо, так как это приведет к перехвату итераторов и тому подобное. Если это большая проблема для вас, возможно, есть компилятор, чтобы отключить его. Проверьте свои документы.

0

Контейнеры STL не должны запускаться «очень медленно» в отладке или в другом месте. Возможно, вы злоупотребляете ими. Вы не работаете против чего-то вроде ElectricFence или Valgrind в отладке? Они замедляют то, что делает много распределений.

Все контейнеры могут использовать пользовательские распределители, которые некоторые используют для повышения производительности, но мне никогда не приходилось использовать их самостоятельно.

+1

Вы никогда явно не писал игру с STL. Проблема заключается не в алгоритмах игр, а в надстройке stl. Когда stl не оптимизирован, он называет 100 функций, когда он будет полностью вложен и что накладные расходы убивают частоту кадров игры. – Tod 2009-09-23 20:26:48

+1

Я написал несколько игр с STL, но, возможно, не в том же масштабе, что и у вас; Я не нашел, что это проблема (но представьте, что это возможно) – MarkR 2009-09-24 14:46:32

4

Если вы используете Visual C++, то вы должны взглянуть на это:

http://channel9.msdn.com/shows/Going+Deep/STL-Iterator-Debugging-and-Secure-SCL/

и ссылка с этой страницы, которые охватывают различные расходы и параметры всех отладочного режима проверяя, что делает MS/Dinkware STL.

Если вы собираетесь задать такую ​​платформу зависимый вопрос, было бы хорошая идея, чтобы отметить свою платформу, тоже ...

3

Отъезда EASTL.

+1

Я не думаю, что EASTL доступен для публики. Но документ охватывает множество проблем с существующими реализациями STL. – Torlack 2008-09-17 20:31:53

+1

На самом деле теперь это - по крайней мере, большинство из них :) https://github.com/paulhodge/EASTL – 2011-04-03 12:01:16

+1

@JohanKotlinski вот новая ссылка: https://github.com/electronicarts/EASTL – 2016-02-14 02:46:58

1

Ultimate ++ имеет свой собственный набор контейнеров - не уверен, что если вы можете использовать их separatelly от остальной части библиотеки: http://www.ultimatepp.org/

10

Если ваши работают визуальные студии вы можете рассмотреть следующие вопросы:

#define _SECURE_SCL 0 
#define _HAS_ITERATOR_DEBUGGING 0 

Это только для итераторов, какие операции STL вы выполняете? Вы можете посмотреть оптимизацию операций с памятью; т.е., используя resize(), чтобы вставить сразу несколько элементов вместо использования pop/push для вставки элементов по одному.

+1

Эти константы должны быть сам за себя? Что они делают? – 2014-06-20 15:28:39

0

Как насчет ACE library? Это объектно-ориентированная среда с открытым исходным кодом для параллельного программного обеспечения связи, но также имеет некоторые классы контейнеров.

21

Мой опыт в том, что хорошо спроектированный STL-код медленно запускается в отладочных сборках, потому что оптимизатор выключен. Контейнеры STL выделяют много вызовов конструкторам и оператору = которые (если они имеют малый вес) встраиваются/удаляются в сборках релизов.

Кроме того, Visual C++ 2005 и выше имеют возможность проверки STL как в сборках релизов, так и для отладки. Это огромная производительность для программного обеспечения STL-heavy. Его можно отключить, указав _SECURE_SCL = 0 для всех ваших единиц компиляции. Обратите внимание, что наличие разных статусов _SECURE_SCL в разных единицах компиляции почти наверняка приведет к катастрофе.

Вы можете создать третью конфигурацию сборки с выключенной проверкой и использовать ее для отладки с производительностью.Я рекомендую вам сохранить конфигурацию отладки с проверкой, хотя, так как очень полезно улавливать ошибочные индексы массивов и тому подобное.

25

EASTL - возможность, но все еще не идеальная. Пол Pedriana из Electronic Arts сделал исследование различных реализаций STL относительно производительности в игровых приложениях резюме который находится здесь: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html

Некоторые из этих корректировок в настоящее время рассматриваются для включения в стандарт C++.

Обратите внимание, что даже EASTL не оптимизирует для неоптимизированного футляра. У меня был файл первенствовать ж/некоторые временные некоторое время назад, но я думаю, что я потерял, но доступ к нему было что-то вроде:

 debug release 
STL  100  10 
EASTL  10   3 
array[i] 3   1 

Самым успешным я имел катится свои собственные контейнеры. Вы можете получить их до почти массив [х] производительности.

6

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

Я говорю о настоящий игра разработка здесь.

1

Checkout Структуры данных и алгоритмы с объектно-ориентированного проектирования шаблонов в C++ Бруно Прайса http://www.brpreiss.com/

3

MSVC использует очень тяжелом реализации проверяемых итераторы в отладочной версии, которые другие уже обсуждали, так что я выиграл» t повторить его (но начать там)

Еще одна интересная вещь, которая может вас заинтересовать, заключается в том, что ваша «сборка отладки» и «сборка релиза», вероятно, связаны с изменением (по крайней мере) 4 настроек, которые связаны только с нею.

  1. Создание файла .pdb (cl/Zi и link/DEBUG), что позволяет символически отлаживать. Вы можете добавить/OPT: указать опции компоновщика; компоновщик оставляет неиспользуемые функции, когда не создает файл .pdb, но с режимом/DEBUG он сохраняет их все (так как символы отладки ссылаются на них), если вы не добавите это явно.
  2. Использование отладочной версии библиотеки времени выполнения C (возможно, MSVCR * D.dll, но это зависит от того, какую рабочую среду вы используете). Это сводится к/т или/MTD (или что-то еще, если не с помощью DLL выполнения)
  3. Выключение оптимизаций компилятора (/ Od)
  4. установки препроцессор #defines DEBUG или NDEBUG

Эти могут переключаться независимо. Первое не стоит ничего в производительности во время выполнения, хотя добавляет размер. Второй делает ряд функций более дорогими, но оказывает огромное влияние на malloc и бесплатно; версии отладки во время выполнения стараются «отравить» память, которую они касаются значениями, чтобы очистить неинициализированные ошибки данных. Я считаю, что с реализациями MSVCP * STL он также устраняет все пулы распределения, которые обычно выполняются, так что утечки показывают именно тот блок, который вы думаете, а не какой-то более крупный фрагмент памяти, который он выделял; это означает, что он делает больше вызовов для malloc поверх них намного медленнее. Третий; хорошо, что он делает много вещей (this question имеет хорошее обсуждение темы). К сожалению, это необходимо, если вы хотите, чтобы одношаговый режим работал плавно. Четвертый затрагивает множество библиотек по-разному, но наиболее примечательно, что он компилирует или отменяет assert() и друзей.

Итак, вы можете подумать о создании сборки с некоторой меньшей комбинацией этих выборов. Я много использую сборки, которые используют символы (/ Zi и link/DEBUG), и утверждает (/ DDEBUG), но все еще оптимизирован (/ O1 или/O2 или любые флаги, которые вы используете), но с указателями фреймов стека очистить обратные трассы (/ Oy-) и использовать обычную библиотеку времени выполнения (/ MT). Это выполняется близко к моей сборке релизов и является полуотверждаемым (обратные трассировки прекрасны, одноступенчатая игра немного путается на исходном уровне, а уровень сборки отлично работает). Вы можете иметь как можно больше конфигураций; просто клонируйте свой релиз и включите все части отладки, которые вам кажутся полезными.

1

Qt переопределил большинство материалов стандартной библиотеки C++ с различными интерфейсами. Это выглядит неплохо, но это может быть дорогостоящим для коммерчески лицензированной версии.

Редактировать: Qt с тех пор был выпущен под номером LGPL, что обычно позволяет использовать его в коммерческом продукте без использования коммерческой версии (которая также существует).