427 votos

Enlazado estático vs dinámico de la vinculación de

Existen imperiosas razones de rendimiento para elegir la vinculación estática sobre la vinculación dinámica o viceversa en ciertas situaciones? He escuchado o leído la siguiente, pero no sé lo suficiente sobre el tema para dar fe de su veracidad.

1) La diferencia entre el rendimiento de la vinculación estática y dinámica vinculación es generalmente insignificante.

2) (1) no es cierto si se utiliza un perfil compilador que utiliza los datos de perfil para optimizar el programa de hotpaths porque con enlaces estáticos, el compilador puede optimizar el código y el código de la biblioteca. Con la vinculación dinámica sólo el código puede ser optimizado. Si la mayoría del tiempo es empleado en la ejecución del código de la biblioteca, esto puede hacer una gran diferencia. De otra manera, (1) se aplica todavía.

375voto

dmckee Puntos 50318
  • Dinámica de la vinculación puede reducir el total de consumo de recursos (si hay más de un proceso de acciones de la misma biblioteca (incluyendo la versión en "el mismo", por supuesto). Creo que este es el argumento de que las unidades de su presencia en la mayoría de los entornos. Aquí los "recursos" incluye espacio en disco, memoria RAM y espacio de caché. Por supuesto, si el enlazador dinámico no es lo suficientemente flexible que existe un riesgo de DLL hell.
  • Dinámica de vinculación significa que las correcciones de errores y mejoras de las bibliotecas se propagan a mejorar su producto sin necesidad de enviar nada.
  • Los Plugins siempre llame para la dinámica vincular.
  • Estática de vinculación, significa que usted puede saber el código se ejecute en muy entornos limitados (temprano en el proceso de arranque, o en modo de rescate).
  • Estática de los enlaces pueden hacer binarios más fácil de distribuir a los diversos entornos de usuario (en el coste de envío de una grande y más los que consumen recursos del programa).
  • Estática de la vinculación puede permitir ligeramente más rápido el inicio de los tiempos, pero esto depende en cierta medida del tamaño y la complejidad de su programa y en los detalles de la OSs, la carga de la estrategia.

Algunas modificaciones para incluir el muy relevante sugerencias en los comentarios y en otras respuestas. Me gustaría señalar que la manera de romper en esto depende mucho de lo que medio ambiente tiene previsto ejecutar en. Mínima de los sistemas integrados pueden no tener los recursos suficientes para apoyar la vinculación dinámica. Ligeramente más pequeño posible que los sistemas de apoyo a la vinculación, porque su memoria es lo suficientemente pequeño como para hacer que la memoria RAM de ahorros de la vinculación dinámica muy atractiva. Completo de los PCs de consumo tienen, como Marca de notas, enormes recursos, y que, probablemente, puede dejar la comodidad de problemas de la unidad de pensamiento en esta materia.


Para abordar el rendimiento y la eficiencia: depende.

Clásicamente, las bibliotecas dinámicas requieren algún tipo de capa de pegamento que a menudo significa el doble de expedición o de una capa extra de indirección en función de direccionamiento y puede costar un poco de velocidad (pero es función del tiempo de llamada en realidad una gran parte de su tiempo de funcionamiento???).

Sin embargo, si está ejecutando varios procesos a la que todos llaman la misma biblioteca mucho, usted puede ahorrar líneas de caché (y por lo tanto la ganancia en el rendimiento de carrera) cuando se utiliza vinculación dinámica relativa mediante la vinculación estática. (A menos que OS moderno son lo suficientemente inteligentes como para aviso de segmentos idénticos en binarios enlazados estáticamente. Parece duro, alguien sabe?)

Otro problema: el tiempo de carga. Usted paga la carga de los costos en algún momento. Cuando usted paga este costo depende de cómo OS funciona tan bien como lo vinculación de utilizar. Tal vez usted prefiere aplazar el pago hasta que usted sabe que usted necesita.

Tenga en cuenta que la electricidad estática vs--la vinculación dinámica es tradicionalmente no un problema de optimización, debido a que ambas involucran compilación independiente de objeto de archivos. Sin embargo, esto no es necesario: un compilador puede, en principio, "compilar", "bibliotecas estáticas" a un digerido AST forma inicialmente, y en "link" ellos mediante la adición de los ASTs a las generadas por el código principal, y así empoderar a la optimización global. Ninguno de los sistemas que uso hacer esto, así que no puedo comentar sobre lo bien que funciona.

El camino a la respuesta de rendimiento preguntas es siempre por pruebas (y el uso de un entorno de prueba tanto como el entorno de implementación como sea posible).

73voto

Lothar Puntos 4740

1) se basa en el hecho de que una llamada a una función DLL es siempre usar un extra indirectos saltar. Y este es generalmente despreciable hoy en día. Dentro de la DLL que hay algunos más arriba en i386 CPU porque no pueden generar código independiente de la posición - en amd64 saltos puede ser relativo al contador de programa, así que esto es una gran mejora.

2) Esto es correcto. Con perfil guiado optimizaciones generalmente, usted puede ganar alrededor de 10 a 15 por ciento en el rendimiento. Ahora la velocidad de la CPU ha alcanzado los límites de lo que podría ser vale la pena hacerlo.

Me gustaría añadir (3) el enlazador puede organizar las funciones en un más caché coherente de la agrupación de manera que la cara de caché de nivel misses son minimizados. También es posible que el efecto de la hora de inicio de aplicaciones.

Y no olvidemos que con las DLL de no eliminación de código muerto puede ser realizado. Según el Idioma de la DLL de código podría no ser óptima compilado así. Las funciones virtuales son siempre virtuales, ya que el compilador no sabe si un cliente es overwritting.

Por esta razón si no hay una verdadera necesidad de DLL sólo estática de compilación.

72voto

Mark Ransom Puntos 132545

Vinculación dinámica es la única manera práctica de cumplir con algunos requisitos de la licencia, tales como la LGPL.

46voto

stakx Puntos 29832

Estoy de acuerdo con los puntos dnmckee menciona, además de:

  • Enlazado estáticamente aplicaciones podría ser más fácil de implementar, ya que hay menos o ningún otro archivo de dependencias (.dll / .so) que podría causar problemas cuando se está perdiendo o se instalen en el lugar equivocado.

35voto

Rob Wells Puntos 21714

Una razón para hacer una vinculado estáticamente construir es para comprobar que usted tiene un cierre completo para el archivo ejecutable, es decir. que todas las referencias de símbolo se resuelven correctamente.

Como una parte de un gran sistema que estaba siendo construido y probado el uso continuo de la integración, de la noche de regresión se realizaron pruebas utilizando una vinculado estáticamente versión de los archivos ejecutables. Ocasionalmente, podríamos ver que un símbolo no iba a resolver y el enlace estático iba a fallar a pesar de la enlazados dinámicamente ejecutable enlace con éxito.

Esto generalmente ocurre cuando los símbolos que estaban profundamente arraigadas dentro de las librerías compartidas tenía escritos erróneamente el nombre y así no enlazar estáticamente. El enlazador dinámico no resolver completamente todos los símbolos, independientemente de la utilización de profundidad o en anchura de evaluación, por lo que puede terminar con un vinculada de forma dinámica archivo ejecutable que no tiene cierre total.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X