Профилирование оказалось _Iterator_base12 :: _ Orphan_me. Что это? - PullRequest
3 голосов
/ 07 июля 2011

Я только что закончил профилирование блока кода, который занял слишком много времени.Рассматриваемый код создает большой boost :: graph из некоторых std :: vectors и std :: set, которые сортируются и вставляются в очень много раз.Тем не менее, я был удивлен, увидев, что большую часть времени уходит не на сортировку или вставку, а на std::_Iterator_base12::_Orphan_me - 97,27%, о которых сообщает AMD CodeAnalyst.Что это за функция?Кажется, он вызывается ~ 2200 раз, общее время выполнения - ~ 30 секунд.

CodeAnalyst не дает мне очень хороший стек вызовов и, кажется, сокращает имена после примерно 120 символов, что не соответствуетдля типа шаблона повышения.Если есть способ улучшить это (я новичок в CodeAnalyst), скажите, пожалуйста, и я мог бы дать более подробную информацию.

1 Ответ

1 голос
/ 18 апреля 2016

Ответ заключается в том, чтобы запустить профилировщик в режиме Release , см. Убийца производительности - Поддержка отладчика отладчика в Visual studio .

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

Исправление свопинга в Orcas делает каждый стандартный контейнер собственным дополнительным динамическивыделенный объект , образно названный «объект aux». Каждый контейнер содержит указатель на свой объект aux, который содержит указатель обратно на контейнер .Каждый итератор вместо того, чтобы держать указатель непосредственно на свой родительский контейнер, теперь содержит указатель на объект aux его родительского контейнера ...

Проблема производительности заключается в том, что объект aux пока неизбежно ... не бесплатно .Каждый стандартный контейнер теперь больше, потому что он должен содержать указатель на свой объект aux.Объект aux должен быть динамически размещен, занимая больше места и занимая больше времени.И _SECURE_SCL выполняет двойное косвенное обращение при переходе от итератора к его родительскому контейнеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...