В одной критически важной части программы есть член класса, который выглядит так: std :: vector m_vLinks; Во время профилирования я заметил, что около 99,98% исполнений этот вектор содержит только 0 или 1 элемент. Однако в очень редких случаях он может содержать больше. Этот вектор, безусловно, является узким местом в соответствии с профайлер, так что я думаю о следующей оптимизации:std :: vector-like класс, оптимизированный для хранения небольшого количества элементов
- Craft ручной работы класса с вектор-подобный интерфейс
- Этот класс будет держать истинный размер, один элемент и необязательный указатель на вектор
- В этом случае, когда вектор содержит 1 элемент, не будет никаких распределений динамической памяти, а также доступ к этому элементу будет (бит) быстрее из-за удаления одной косвенности.
- Когда нам нужно держать больше векторные данные динамически выделяются
- Конечно, этот вектор не будет предоставлять один блок памяти держит все элементы (здесь не требуется), а также некоторые операции будут более сложными
Прежде чем начать прототип этой вещи, чтобы узнать, помогает ли она, интересно, кто-нибудь сталкивался с пользовательскими контейнерами с аналогичной функциональностью в некоторых сторонних библиотеках?
Я уже думал о повышающем :: массива, но не хочу, максимального размера, который он навязывает
Какие операции занимают большую часть времени в вашем сценарии? – sharptooth
является узким местом, потому что вы часто создаете новые? В этом случае я сомневаюсь, что ваша оптимизация поможет ... –
Выделение и освобождение динамического буфера вектора (я использую пул объектов для хранения объектов, которые имеют этот элемент, но в любом случае необходимо периодически очищать их путем замены вектора ссылок с пустым вектором, хотя это не частая операция). –