Я работаю над очень крупномасштабной вычислительной библиотекой, которая активно использует STL. Библиотека создается с использованием MSVC2003 и его реализации на STL. Я ищу альтернативную реализацию STL, которая поможет библиотеке снизить требования к памяти и повысить ее производительность.
На данный момент невозможно перейти на более новую версию MSVC.
Я хотел бы получить отзывы об использовании в реальном мире, если это возможно, не на основе тестов.
Обновлено: Чтобы было немного понятнее, например, некоторые реализации STL (например, STLSoft) предлагают определенные оптимизации для конкатенации строк; это может показаться незначительным по влиянию, но они могут привести к значительным улучшениям. STLPort - еще один хороший пример, в котором они четко заявляют о своей цели: наличие самой быстрой реализации STL, есть stdlib ++ и т. д. Все это могут быть хорошими кандидатами, но у меня нет времени тестировать их все, мне нужна помощь сообщества на что.
Интересно, как новый libC++ из проекта LLVM будет сравниваться с другими реализациями. Предположительно, он полагается на некоторые функции C++ 11 для повышения производительности. У кого-нибудь есть опыт работы с этим?





STLPort. Не измерял различия в использовании памяти, но это определенно быстрее (да, в реальном мире).
Полезно отметить, что даже разработчики видеоигр используют STLPort. См .: Реликвия.
@Hooked: Вы можете указать только студию один, которая его использует? Это худшая основа выборки за всю историю. ;)
О, если бы я пытался поразить вас количеством точек данных, я бы постарался больше. : D
Я ставлю под сомнение вашу основную предпосылку, что вы не можете перейти на более новую версию MSVC.
Я не думаю, что вы получите меньше памяти и повысите производительность «бесплатно», загрузив новый STL. Или, по крайней мере, если бы вы это сделали, вам, вероятно, пришлось бы сделать столько же исправлений кода, как если бы вы просто обновились до последней версии MSVC.
В долгосрочной перспективе нет никаких сомнений в том, что вы хотите обновить ... Сделайте это сейчас, и вам, мог бы, повезет и вы получите часть этой памяти и производительности бесплатно.
Единственное, что я могу предложить вам в соответствии с тем, что вы говорите, что ищете, - это попробовать компилятор Intel, который у меня был как хороший (производительность!), Так и плохой (причудливый, иногда!) с.
Помимо этого, найдите собственные проблемы с памятью и производительностью и напишите собственные контейнеры и алгоритмы. STL - это круто, но это не панацея от решения всех проблем во всех случаях. Знание предметной области - ваш лучший союзник.
Ваш ответ никоим образом не помогает, поскольку вы, очевидно, предлагаете то, что в настоящее время нельзя рассматривать и, очевидно, не будет.
Как уже известно многим специалистам в данной области, реализация STL имеет разные профили производительности и памяти. Исходя из этого факта, мне кажется справедливым найти те, которые лучше всего подходят для других, и опробовать их в моем собственном приложении.
Под "доменом" я имел в виду ваше актуальное проблемное пространство. IE, я работаю с медицинским программным обеспечением, поэтому я работаю с настраиваемыми контейнерами и алгоритмами, которые специфичны для шаблонов доступа, распространенных в моем медицинском программном обеспечении. И я согласен с yrp, что STLPort стоит попробовать.
Большинство реализаций STL, включая MSVC2003, являются хорошо реализованными универсальными библиотеками. Таким образом, вы не увидите значительного повышения производительности от одной реализации к другой.
Однако иногда вы можете написать алгоритм (или контейнер), который для вас быстрее, чем STL, потому что вы знаете кое-что о своих данных, что писатель STL не создал нового (поскольку они писали общие контейнеры и алгоритм).
В заключение, если вы хотите улучшить производительность своих приложений, вам лучше попытаться создать специализированные контейнеры, специально подходящие для ваших данных, чем искать более производительный STL.
Если производительность так важна для вашего приложения, и STL вплетен в него, можно ли найти реализацию с открытым исходным кодом (например, STL-порт, как уже упоминалось) и разветвить ее для себя, внося улучшения производительности по мере необходимости?
С одной стороны, я вижу, что это становится скользкой дорожкой, когда вы вносите нестандартные изменения в свой форк библиотеки STL, создавая тем самым проблемы. Однако важность производительности для вашего приложения может перевесить риск того, что это произойдет.
Производительность вряд ли будет критичной, учитывая заявление, что они не могут обновиться. Если бы это было действительно критично, это было бы превыше претензий на отказ от обновления.
Вы не думали написать свой собственный распределитель памяти? Вам не всегда нужно переключать весь STL, если вам просто не нравится стратегия распределения памяти. Все контейнеры допускают замену распределителя.
Вы профилировали свой код и продумали небольшие изменения в проблемных областях? Я думаю, это будет гораздо менее болезненно, чем то, что вы рассматриваете.
По большей части это зависит от того, о каком контейнере вы говорите и как вы его используете. вектор обычно занимает наименьшее место, за исключением того момента, когда вы добавляете элемент, превышающий текущую емкость вектора. В этот момент он выделит что-то вроде 1,5-кратной текущей емкости векторов, переместит элементы (или, в худшем случае, сделает новую копию, которая также выделяет память), и когда это будет сделано, удалите внутренние внутренние элементы старых векторов, если вы знаете, как многие элементы он будет удерживать впереди, лучше всего использовать вектор с использованием резерва.
Второй по величине - список. Его преимущество в том, что он не будет создавать временную копию самого себя. После этого сета, вероятно, будет установлена ваша лучшая ставка. У некоторых реализаций есть список, который меньше. В этих случаях довольно легко создать распределитель, который упаковывает память в страницы. Держитесь подальше от пожирателей памяти, таких как unordered_ *
В MSVC убедитесь, что #define _SECURE_SCL = 0 Это снимает много накладных расходов, используемых для проверок безопасного программирования (например, переполнение буфера и т. д.)
Безусловно, наиболее эффективными с точки зрения памяти контейнерами являются повышающие / навязчивые. Они занимают чрезвычайно мало места, поскольку используют память содержащихся в них вещей. Таким образом, при переходе к куче для небольшого фрагмента памяти для связанного списка или узла дерева rb указатели узлов являются частью самого объекта. Тогда «контейнер» - это всего лишь один необработанный набор из нескольких указателей для создания корневого узла. Я использовал его довольно много раз, чтобы избавиться от служебных данных и распределения ресурсов.
Возможно, лучше перефразировать свой вопрос как «Что такое .. с наименьшим потреблением памяти», или добавить к нему метку субъективности.