2011-09-03 12 views
6

Quanto è grande una penalizzazione delle prestazioni quando si richiamano le funzioni dalla DLL? Il caricamento della DLL non è un problema per noi, il numero di chiamate alla nostra libreria highperf non sarà grande.Overhead della chiamata di funzione DLL

Circa, quante istruzioni/cicli di clock effettuano una chiamata su una chiamata di libreria statica?

+0

possibile duplicato di [Overhead di DLL] (http://stackoverflow.com/questions/4030043/overhead-of-dll) –

risposta

11

La mia risposta si basa su come funziona il linker dinamico Linux/glibc/ELF, ma vorrei assumere la risposta generale è lo stesso per le altre piattaforme:

C'è una differenza tra la prima chiamata a un carico dinamico simbolo e le prossime chiamate. La prima chiamata è costosa, può coinvolgere molti cicli. Tutte le altre chiamate sono più o meno 1 - 2 istruzioni di distanza.

Il modo in cui funziona è che il linker imposta una voce nella tabella di concatenamento della procedura che acquisisce un indirizzo per quella funzione esterna dalla tabella di offset globale. A prima chiamata l'indirizzo dei punti GOT a uno stub che esegue il linker dinamico per risolvere l'indirizzo reale della funzione nella DLL. Questo può richiedere molti cicli, ma una volta eseguito, il linker dinamico traccia la voce GOT per puntare direttamente alla funzione, quindi la prossima volta che viene chiamato il codice PLT chiamerà direttamente la funzione.

Ecco un link ad una discreta passeggiata attraverso di questo processo: http://www.technovelty.org/linux/pltgot.html

+1

In una DLL su Windows tutto il lavoro viene svolto dal caricatore al momento del caricamento del modulo. –

+0

Credo sia vero solo se la DLL non è caricata dinamicamente con LoadLibrary. –

+0

@Tamas: perché? Perché abbiamo bisogno del caricamento in fase di runtime. – Cartesius00

Problemi correlati