Мониторинг изменения размеров стандартного контейнера - PullRequest
3 голосов
/ 06 марта 2020

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

У меня сложное время отслеживания какой контейнер растет путем ручного поиска по коду, и надеялся отследить резервирование контейнера с помощью gdb.

Есть ли точка останова (или несколько точек останова), которую я могу установить, чтобы GDB остановил выполнение, если контейнер резервирует больше пространства? Я не уверен, является ли контейнер вектором, картой или набором, поэтому, если все три используют один и тот же базовый вызов для изменения размера, это может быть лучше. В противном случае я с удовольствием установлю несколько точек останова.

1 Ответ

0 голосов
/ 06 марта 2020

Можно ли установить точку останова (или несколько точек останова), чтобы GDB прекратил выполнение, если контейнер резервирует больше места?

Нет: вектор, карта и набор не имеют общего resize (за исключением того, что все в конечном итоге попадают в ::operator new).

Вы можете установить условное ::operator new точка останова для достаточно большого размера, и посмотрите, откуда это вызывается.

наводит на мысль об удвоении размера контейнеров при увеличении емкости.

Обратите внимание, что только vector делает это, поэтому установка точки останова на std::vector...::_M_allocate (для libstdc++), вероятно, является хорошей отправной точкой.

...