490 Stimmen

Statische Verknüpfung vs. dynamische Verknüpfung

Gibt es zwingende Leistungsgründe, die in bestimmten Situationen dafür sprechen, statisches Linking dem dynamischen Linking vorzuziehen oder umgekehrt? Ich habe Folgendes gehört oder gelesen, aber ich weiß nicht genug über das Thema, um mich für seine Richtigkeit zu verbürgen.

1) Der Unterschied in der Laufzeitleistung zwischen statischem Linking und dynamischem Linking ist in der Regel vernachlässigbar.

2) (1) trifft nicht zu, wenn ein profilierender Compiler verwendet wird, der Profildaten zur Optimierung von Programm-Hotpaths verwendet, da der Compiler beim statischen Linken sowohl Ihren Code als auch den Code der Bibliothek optimieren kann. Beim dynamischen Linking kann nur Ihr Code optimiert werden. Wenn die meiste Zeit mit der Ausführung von Bibliothekscode verbracht wird, kann dies einen großen Unterschied ausmachen. Ansonsten gilt immer noch (1).

21voto

AProgrammer Punkte 49452

1/ Ich habe an Projekten mitgewirkt, bei denen dynamisches Linking mit statischem Linking verglichen wurde, und der Unterschied war nicht so gering, dass man auf dynamisches Linking umgestiegen wäre (ich war nicht an dem Test beteiligt, ich kenne nur die Schlussfolgerung)

2/ Dynamisches Linking wird oft mit PIC (Position Independent Code, Code, der je nach der Adresse, an der er geladen wird, nicht geändert werden muss) in Verbindung gebracht. Abhängig von der Architektur kann PIC eine weitere Verlangsamung mit sich bringen, wird aber benötigt, um den Vorteil der gemeinsamen Nutzung einer dynamisch gelinkten Bibliothek durch zwei ausführbare Programme zu erhalten (und sogar durch zwei Prozesse desselben ausführbaren Programms, wenn das Betriebssystem die Randomisierung der Ladeadresse als Sicherheitsmaßnahme verwendet). Ich bin mir nicht sicher, ob alle Betriebssysteme eine Trennung der beiden Konzepte erlauben, aber Solaris und Linux tun dies und ich vermute, dass HP-UX dies ebenfalls tut.

3/ Ich habe schon an anderen Projekten mitgearbeitet, die dynamisches Linking für die Funktion "easy patch" verwendet haben. Aber dieser "einfache Patch" macht die Verteilung von kleinen Korrekturen etwas einfacher und von komplizierten zu einem Versions-Albtraum. Am Ende mussten wir oft alles pushen und Probleme beim Kunden nachverfolgen, weil die falsche Version auf dem Token war.

Meine Schlussfolgerung ist, dass ich die statische Verknüpfung ausgenommen hatte:

  • für Dinge wie Plugins, die auf dynamische Verknüpfungen angewiesen sind

  • wenn die gemeinsame Nutzung wichtig ist (große Bibliotheken, die von mehreren Prozessen gleichzeitig verwendet werden, wie z. B. C/C++-Laufzeitumgebung, GUI-Bibliotheken, ..., die oft unabhängig verwaltet werden und für die die ABI streng definiert ist)

Wenn man den "einfachen Patch" verwenden möchte, würde ich argumentieren, dass die Bibliotheken wie die großen Bibliotheken oben verwaltet werden müssen: sie müssen nahezu unabhängig sein mit einer definierten ABI, die nicht durch Korrekturen verändert werden darf.

14voto

yoAlex5 Punkte 20661

Static linking ist ein Prozess in der Kompilierzeit, bei dem ein verknüpfter Inhalt in die primäre Binärdatei kopiert und zu einer einzigen Binärdatei wird.

Nachteile:

  • die Kompilierzeit ist länger
  • Ausgabe binär ist größer

Dynamic linking ist ein Prozess zur Laufzeit, wenn ein verlinkter Inhalt geladen wird. Diese Technik ermöglicht es:

  • verlinkte Binärdatei aktualisieren, ohne eine primäre Binärdatei neu zu kompilieren, die eine ABI Stabilität [Über]
  • hat eine einzige gemeinsame Kopie

Nachteile:

  • die Startzeit ist langsamer (verlinkte Inhalte sollten kopiert werden)
  • Linker-Fehler werden zur Laufzeit ausgelöst

[iOS Statisches vs. Dynamisches Framework]

12voto

Hans Passant Punkte 894572

Es ist eigentlich ganz einfach. Wenn Sie eine Änderung an Ihrem Quellcode vornehmen, wollen Sie dann 10 Minuten oder 20 Sekunden warten, bis er erstellt ist? Zwanzig Sekunden ist alles, was ich ertragen kann. Danach muss ich entweder das Schwert aus der Hand legen oder darüber nachdenken, wie ich durch separate Kompilierung und Verlinkung wieder in die Komfortzone zurückkehren kann.

12voto

Arne Punkte 7488

Bestes Beispiel für dynamisches Linking ist, wenn die Bibliothek von der verwendeten Hardware abhängig ist. In alten Zeiten wurde beschlossen, die C-Mathe-Bibliothek dynamisch zu gestalten, damit jede Plattform alle Prozessorfähigkeiten nutzen kann, um sie zu optimieren.

Ein noch besseres Beispiel könnte OpenGL sein. OpenGl ist eine API, die von AMD und NVidia unterschiedlich implementiert wird. Und Sie können eine NVidia-Implementierung nicht auf einer AMD-Karte verwenden, weil die Hardware unterschiedlich ist. Aus diesem Grund können Sie OpenGL nicht statisch in Ihr Programm einbinden. Dynamisches Linken wird hier verwendet, damit die API für alle Plattformen optimiert werden kann.

9voto

Thomas Matthews Punkte 54757

Die dynamische Verknüpfung erfordert zusätzliche Zeit für das Betriebssystem, um die dynamische Bibliothek zu finden und sie zu laden. Beim statischen Linking ist alles beisammen, und es ist ein einmaliges Laden in den Speicher.

Siehe auch DLL-Hölle . Dies ist das Szenario, in dem die DLL, die das Betriebssystem lädt, nicht diejenige ist, die mit Ihrer Anwendung geliefert wurde, oder die Version, die Ihre Anwendung erwartet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X