Повлияет ли добавление опции -rdynamic linker на gcc/g++ на производительность?
Я хочу получить трассировку стека при сбое приложения. Я понимаю, что опция -rdynamic позволяет получить полную трассировку стека с именами функций. Но я обеспокоен, повлияет ли это на производительность моего приложения.
1 ответ
Да, есть, хотя это очень специфично и обычно не вызывает беспокойства.
Опция -rdynamic указывает компоновщику добавлять символы в таблицы символов, которые обычно не нужны во время выполнения. Это означает, что есть еще, возможно, намного больше символов, которые динамический компоновщик должен проползать во время выполнения для разрешения символов.
В частности, поскольку поиск в таблице символов в системах на основе GNU реализован с использованием хеша, наличие большего количества символов увеличивает вероятность возникновения коллизий хешей. Поскольку все символы, которые сталкиваются в хэш-таблице, находятся в списке, компоновщик времени выполнения должен пройти по списку и сравнить, используя memcmp, каждое имя символа. Наличие большего количества символов в хеш-значении означает наличие более длинных списков, поэтому для разрешения каждого динамического символа потребуется больше времени.
Эта ситуация немного хуже для C++, чем для C, с множеством одинаково префиксных имен символов из-за имен классов.
На практике это влияет только на первый раз, когда используется символ, и поэтому, если ваше приложение не очень большое и содержит много символов, оно не будет ощущаться.
В том редком случае, когда ваше приложение настолько велико, для преодоления накладных расходов можно использовать такие приемы, как предварительная ссылка.