интерпретация _dl_runtime_resolve_xsave'2 в выводе callgrind - PullRequest
0 голосов
/ 08 февраля 2019

Глядя на вывод callgrind для запуска моей программы, я вижу, что 125% !!!из циклов тратится в _dl_runtime_resolve_xsave'2 (очевидно, часть динамического компоновщика), в то время как 100% тратится в основном.Но это также говорит о том, что почти все время, проведенное внутри _dl_runtime_resolve_xsave'2, фактически потрачено на внутренние методы (self = 0%), но callgrind не показывает никаких вызовов для этого метода.Более того, похоже, что _dl_runtime_resolve_xsave'2 вызывается из нескольких мест в программе, которую я профилирую.

Я могу понять, что некоторое время может быть потрачено за пределами main, потому что программа, которую я профилирую, использует шаблон прототипа, и многие прототипы объектов создаются, когда загружается их динамическая библиотека, но это не может быть где-то близко к 25% времени этого конкретного прогона (потому что если я выполняю этот прогон без входных данных, это займет на порядки меньше времени, чем прогон, который я профилирую сейчас).

Также программа не использует dlopen для открытияобщие объекты после запуска программы.Все должно быть загружено в начале.

Вот скриншот окна kcachegrind: enter image description here

Как я могу интерпретировать эти вызовы _dl_runtime_resolve_xsave'2?Нужно ли беспокоиться о времени, потраченном на этот метод?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 09 февраля 2019

_dl_runtime_resolve_xsave используется в динамическом загрузчике glibc во время отложенного связывания.Он ищет символ функции во время первого вызова функции, а затем выполняет хвостовой вызов реализации.Если вы не используете что-то вроде LD_BIND_NOT=1 в среде при запуске программы, это одноразовая операция, которая происходит только при первом вызове функции.Ленивое связывание имеет определенную стоимость, но если у вас много функций, которые вызываются ровно один раз, это не сильно повлияет на стоимость выполнения.Скорее всего, это артефакт создания отчетов, возможно, связанный с хвостовым вызовом или довольно экзотической XSAVE инструкцией, используемой в _dl_runtime_resolve_xsave.

. Вы можете отключить отложенное связывание, запустив программу с переменной среды LD_BIND_NOW=1В этом случае батут динамического загрузчика не будет использоваться, поскольку все функции будут разрешены при запуске.Кроме того, вы можете связать с -Wl,-z,now, чтобы сделать это изменение постоянным (по крайней мере, для кода, который вы связываете, системные библиотеки могут по-прежнему использовать отложенное связывание для своих собственных символов функций).

...