1) polega na tym, że wywołanie funkcji DLL zawsze wykorzystuje dodatkowy skok pośredni. Dzisiaj jest to zwykle nieistotne. Wewnątrz biblioteki DLL występuje więcej obciążenia na procesorach i386, ponieważ nie mogą one generować kodu niezależnego od pozycji. Na amd64 skoki mogą być względne względem licznika programu, więc jest to ogromna poprawa.
2) To prawda. Dzięki optymalizacjom prowadzonym przez profilowanie zwykle można uzyskać około 10-15 procent wydajności. Teraz, gdy szybkość procesora osiągnęła już limit, warto to zrobić.
Dodałbym: (3) linker może organizować funkcje w bardziej wydajnym grupowaniu pamięci podręcznej, aby zminimalizować kosztowne pomyłki w poziomie pamięci podręcznej. Może to również w szczególności wpłynąć na czas uruchamiania aplikacji (na podstawie wyników, które widziałem z kompilatorem Sun C ++)
I nie zapominaj, że w bibliotekach DLL nie można wyeliminować martwego kodu. W zależności od języka kod DLL może również nie być optymalny. Funkcje wirtualne są zawsze wirtualne, ponieważ kompilator nie wie, czy klient go nadpisuje.
Z tych powodów, na wypadek, gdyby nie było potrzeby używania bibliotek DLL, wystarczy użyć kompilacji statycznej.
EDYCJA (aby odpowiedzieć na komentarz, podkreślenie użytkownika)
Oto dobry zasób na temat problemu z kodem niezależnym od pozycji http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
Jak wyjaśniono, x86 nie ma ich AFAIK dla niczego innego niż 15-bitowe zakresy skoków, a nie dla bezwarunkowych skoków i wywołań. Dlatego funkcje (z generatorów) mające ponad 32 KB zawsze stanowiły problem i wymagały wbudowanych trampolin.
Ale w popularnym systemie operacyjnym x86, takim jak Linux, nie trzeba się przejmować, jeśli plik .so / DLL nie zostanie wygenerowany za pomocą gcc
przełącznika -fpic
(co wymusza użycie pośrednich tabel skoków). Ponieważ jeśli tego nie zrobisz, kod zostanie naprawiony tak, jak zwykły linker go przeniesie. Ale czyniąc to, segment kodu nie jest współdzielony i potrzebowałoby pełnego odwzorowania kodu z dysku do pamięci i dotknięcia go, zanim będzie można go użyć (opróżnienie większości pamięci podręcznych, uderzenie w TLB) itp. Był czas kiedy uznano to za wolne.
Więc nie miałbyś już żadnych korzyści.
Nie przypominam sobie, co dało OS (Solaris czy FreeBSD) mi problemy z moim systemie build Unix, bo po prostu nie było to robi i zastanawiał się, dlaczego rozbił aż stosowane -fPIC
do gcc
.