1) заснований на тому, що виклик функції DLL завжди використовує додатковий непрямий стрибок. Сьогодні це, як правило, незначно. Всередині DLL є ще кілька накладних витрат на процесор i386, оскільки вони не можуть генерувати незалежний від позиції код. У програмі amd64 стрибки можуть бути відносно лічильника програм, тому це величезне вдосконалення.
2) Це правильно. Завдяки оптимізаціям, керованим профілюванням, ви зазвичай можете виграти приблизно 10-15 відсотків продуктивності. Тепер, коли швидкість процесора досягла своїх меж, можливо, варто це зробити.
Я додам: (3) лінкер може організовувати функції в більш ефективному кешуванні групування, щоб зменшити недоліки рівня дорогого кешу. Це також може особливо вплинути на час запуску програм (на основі результатів, які я бачив із компілятором Sun C ++)
І не забувайте, що з DLL-файлами усунення мертвого коду неможливо. Залежно від мови, код DLL також не може бути оптимальним. Віртуальні функції завжди віртуальні, оскільки компілятор не знає, чи перезаписав його клієнт.
З цих причин, якщо немає реальної потреби в DLL, тоді просто використовуйте статичну компіляцію.
EDIT (відповісти на коментар, підкресливши користувач)
Ось хороший ресурс щодо незалежної від коду проблеми http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
Як було пояснено, x86 не має у них AFAIK ні для чого іншого, ніж 15 бітових діапазонів стрибків, а не для безумовних стрибків і викликів. Ось чому функції (від генераторів), що мають більше 32 Кб, завжди були проблемою і потребували вбудованих батутів.
Але в таких популярних ОС x86, як Linux, вам не потрібно дбати, чи файл .so / DLL не генерується за допомогою gcc
перемикача -fpic
(що примушує використовувати таблиці непрямих переходів ). Тому що, якщо ви цього не зробите, код просто фіксується, як звичайний лінкер переселить його. Але, роблячи це, він робить кодовий сегмент незмінним, і йому буде потрібно повне відображення коду з диска в пам'ять і дотик до нього всього, перш ніж його можна буде використовувати (спорожнення більшості кеш-пам'яті, натискання TLB) тощо. Був час коли це вважалося повільним.
Тож ви більше не мали б жодної вигоди.
Я не пригадую, яка ОС (Solaris або FreeBSD) створювала мені проблеми з моєю системою збирання Unix, тому що я просто цього не робив і цікавився, чому вона вийшла з ладу, поки я не звернувся -fPIC
до неї gcc
.