Повлияет ли добавление опции -rdynamic linker на gcc/g++ на производительность?

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

1 ответ

Решение

Да, есть, хотя это очень специфично и обычно не вызывает беспокойства.

Опция -rdynamic указывает компоновщику добавлять символы в таблицы символов, которые обычно не нужны во время выполнения. Это означает, что есть еще, возможно, намного больше символов, которые динамический компоновщик должен проползать во время выполнения для разрешения символов.

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

Эта ситуация немного хуже для C++, чем для C, с множеством одинаково префиксных имен символов из-за имен классов.

На практике это влияет только на первый раз, когда используется символ, и поэтому, если ваше приложение не очень большое и содержит много символов, оно не будет ощущаться.

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

Другие вопросы по тегам