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.