2011-09-03 15 views
6

¿Qué tan grande es una penalización de rendimiento al llamar a funciones desde DLL? Cargando DLL no es un problema para nosotros, el número de llamadas a nuestra biblioteca highperf no será grande.Sobrecarga de la llamada a la función DLL

Aproximadamente, ¿cuántas instrucciones/ciclos de reloj hace que una llamada se haga cargo de una llamada de biblioteca estática?

+0

posible duplicado de [arriba de la DLL] (http://stackoverflow.com/questions/4030043/overhead-of-dll) –

Respuesta

11

Mi respuesta se basa en cómo funciona el enlazador dinámico de Linux/glibc/ELF, pero yo supongo que la respuesta general es el mismo para otras plataformas:

Hay una diferencia entre la primera llamada a un dinámicamente cargado símbolo y las próximas llamadas. La primera llamada es costosa, puede implicar muchos ciclos. Todas las otras llamadas son más o menos 1 - 2 instrucción de distancia.

La manera en que funciona es que el enlazador establece una entrada en la Tabla de vinculación de procedimientos que toma una dirección para esa función externa de la Tabla de compensación global. Al principio, llame a la dirección de los puntos GOT a un apéndice que ejecuta el enlazador dinámico para resolver la dirección real de la función en el archivo DLL. Esto puede llevar muchos ciclos, pero una vez que se hace una vez, el enlazador dinámico encaminará la entrada GOT para apuntar directamente a la función, por lo que la próxima vez que se llame al código PLT se llamará directamente a la función.

Aquí hay un enlace a una bastante buena caminata a través de este proceso: http://www.technovelty.org/linux/pltgot.html

+1

En una DLL en Windows, todo ese trabajo lo hace el cargador al momento de cargar el módulo. –

+0

Creo que eso solo es cierto si el archivo DLL no se carga dinámicamente con LoadLibrary. –

+0

@Tamas: ¿Por qué? Porque necesitamos cargar el tiempo de ejecución. – Cartesius00

Cuestiones relacionadas