2011-01-12 11 views
11

Dado que las bibliotecas vinculadas dinámicamente tienen que resolverse en tiempo de ejecución, ¿los ejecutables vinculados estáticamente son más rápidos que los ejecutables dinámicamente vinculados?¿Es un ejecutable enlazado estáticamente más rápido que un ejecutable dinámicamente vinculado?

+1

Normalmente, cuando se vincula dinámicamente en una biblioteca, se produce una sobrecarga para las llamadas. Una llamada atraviesa una tabla intermedia y como la biblioteca misma está asignada como de solo lectura, todas sus variables también deben residir fuera de la biblioteca. Sin embargo, no conozco los detalles para Windows. Por lo general, la sobrecarga es insignificante y es mucho mejor elegir enlaces dinámicos. Para fines de reutilización de código y la capacidad de actualizar una biblioteca con un agujero de seguridad. –

+0

Posible duplicado de [Enlace estático vs enlace dinámico] (http://stackoverflow.com/questions/1993390/static-linking-vs-dynamic-linking) – Arnaud

Respuesta

3

Depende del estado de su disco y de si las DLL se pueden usar o no en otros procesos. Un comienzo frío ocurre cuando su programa y sus archivos DLL nunca se cargaron antes. Un EXE sin DLL tiene un inicio en frío más rápido ya que solo se necesita encontrar un archivo. Tendría que tener un disco muy fragmentado que esté casi lleno para no tener este caso.

Una DLL puede comenzar a pagar cuando ya está cargada en otro proceso. Ahora las páginas de códigos de la DLL son simplemente compartidas, la sobrecarga de inicio es muy baja y el uso de la memoria es eficiente.

Un caso algo similar es un inicio en caliente, un inicio donde la DLL todavía está disponible en la memoria caché del sistema de archivos de una vez anterior. La diferencia entre un inicio en frío y uno cálido puede ser bastante significativa en un disco lento. La única razón por la que a todo el mundo le gusta un SSD.

9

La vinculación estática produce un archivo ejecutable más grande que el enlace dinámico porque tiene que compilar todo el código de la biblioteca directamente en el ejecutable. El beneficio es una reducción en la sobrecarga de ya no tener que llamar a las funciones de una biblioteca, y en cualquier lugar desde tiempos de carga algo notablemente más rápidos.

Un ejecutable enlazado dinámicamente será más pequeño porque coloca las llamadas en tiempo de ejecución en las bibliotecas de códigos compartidos. Esto tiene varias ventajas, pero las más importantes desde una perspectiva de velocidad u optimización son la reducción en la cantidad de espacio en disco y la memoria consumida, y la multitarea mejorada debido al consumo reducido de recursos (particularmente en Windows).

Por lo tanto, es una solución de compromiso: hay argumentos para hacer por qué cualquiera de ellos puede ser marginalmente más rápido. Dependería de muchas cosas diferentes, como hasta qué punto las rutinas de velocidad crítica en el programa dependían de las llamadas a las funciones de la biblioteca. Pero el punto importante a destacar en la declaración anterior es que podría ser marginalmente más rápido. La diferencia de velocidad será casi imperceptible, y difícil de distinguir incluso de las fluctuaciones normales y esperadas.

Si realmente te importa, haz una evaluación comparativa y observa. Pero le aconsejo que esto es una pérdida de tiempo, y que existen formas más efectivas y más importantes de aumentar la velocidad de su aplicación. Estará mucho mejor a largo plazo teniendo en cuenta factores distintos a la velocidad al tomar la decisión de "vincular dinámicamente o vincular estáticamente". Por ejemplo, vale la pena considerar la vinculación estática si necesita hacer que su aplicación sea más fácil de implementar, particularmente en entornos de usuarios diversos. O bien, los enlaces dinámicos pueden ser una mejor opción (especialmente si esas bibliotecas compartidas no son suyas) porque su aplicación obtendrá automáticamente los beneficios de las actualizaciones realizadas en cualquiera de las bibliotecas compartidas que llama sin tener que mover un dedo.


EDIT: Microsoft hace la recomendación específica que prefer dynamic linking over static linking:

No se recomienda para redistribuir aplicaciones C/C++ que estáticamente enlace a Visual C bibliotecas ++.Es a menudo se supone erróneamente que por enlazando estáticamente su programa a bibliotecas de Visual C++ es posible mejorar significativamente el rendimiento de una aplicación. Sin embargo, el impacto en el rendimiento de la carga dinámica de las bibliotecas de Visual C++ es insignificante en casi todos los casos. Además, el enlace estático no permite dar servicio a la aplicación y sus bibliotecas dependientes ya sea por el autor de la aplicación o Microsoft. Para el ejemplo , considere una aplicación que está vinculada estáticamente a una biblioteca particular , que se ejecuta en una computadora cliente con una nueva versión de esta biblioteca. La aplicación todavía usa código de la versión anterior de esta biblioteca, y no se beneficia de las mejoras de la biblioteca , como las mejoras de seguridad . Se recomienda encarecidamente a los autores de las aplicaciones C/C++ pensar en el escenario de servicio antes de decidir vincular estáticamente a las bibliotecas dependientes , y usar enlaces dinámicos siempre que sea posible.

Cuestiones relacionadas