2011-01-12 6 views
11

Da dynamisch verknüpfte Bibliotheken zur Laufzeit aufgelöst werden müssen, sind statisch verknüpfte ausführbare Dateien schneller als dynamisch verknüpfte ausführbare Dateien?Ist eine statisch verknüpfte ausführbare Datei schneller als eine dynamisch verknüpfte ausführbare Datei?

+1

In der Regel, wenn Sie dynamisch in einer Bibliothek verknüpfen, gibt es einige Overhead für Anrufe. Ein Aufruf durchläuft eine Zwischentabelle und da die Bibliothek selbst schreibgeschützt zugeordnet ist, müssen alle ihre Variablen auch außerhalb der Bibliothek liegen. Ich kenne die Details für Windows jedoch nicht. Normalerweise ist der Overhead vernachlässigbar und es ist viel besser, eine dynamische Verknüpfung zu wählen. Zum Zweck der Wiederverwendung von Code und der Möglichkeit, eine Bibliothek mit einem Sicherheitsloch zu aktualisieren. –

+0

Mögliches Duplikat von [Statische Verknüpfung vs dynamische Verknüpfung] (http://stackoverflow.com/questions/1993390/static-linking-vs-dynamic-linking) – Arnaud

Antwort

3

Es hängt vom Zustand Ihrer Festplatte und davon ab, ob die DLLs in anderen Prozessen verwendet werden. Ein Kaltstart erfolgt, wenn Ihr Programm und seine DLLs noch nie zuvor geladen wurden. Eine EXE ohne DLLs hat einen schnelleren Kaltstart, da nur eine Datei gefunden werden muss. Sie müssten eine stark fragmentierte Festplatte haben, die fast voll ist, um diesen Fall nicht zu haben.

Eine DLL kann sich auszahlen, wenn sie bereits in einem anderen Prozess geladen ist. Jetzt sind die Codepages der DLL einfach freigegeben, Startup-Aufwand ist sehr niedrig und Speichernutzung ist effizient.

Ein etwas ähnlicher Fall ist ein Warmstart, ein Startup, bei dem die DLL immer noch im Dateisystemcache von einem früheren Zeitpunkt verfügbar ist. Der Unterschied zwischen einem kalten und einem warmen Start kann auf einer trägen Scheibe ziemlich signifikant sein. Der eine Grund, dass jeder eine SSD mag.

9

Die statische Verknüpfung erzeugt eine größere ausführbare Datei als die dynamische Verknüpfung, da sie den gesamten Bibliothekscode direkt in die ausführbare Datei kompilieren muss. Der Vorteil ist eine Reduzierung des Overheads, weil Funktionen nicht mehr aus einer Bibliothek aufgerufen werden müssen und irgendwo von etwas bis zu merklich schnelleren Ladezeiten.

Eine dynamisch verknüpfte ausführbare Datei wird kleiner sein, da sie Aufrufe zur Laufzeit an freigegebene Codebibliotheken absetzt. Dies hat mehrere Vorteile. Aus Gründen der Geschwindigkeit oder der Optimierung sind jedoch die Verringerung des Speicherplatzes und des belegten Speicherplatzes sowie die verbesserte Multitasking-Funktion aufgrund des geringeren Ressourcenverbrauchs (insbesondere unter Windows) vonnöten.

So ist es ein Kompromiss: gibt es Argumente, die gemacht werden sollten, warum man entweder marginal schneller sein könnte. Es hängt von vielen verschiedenen Dingen ab, beispielsweise davon, in welchem ​​Ausmaß sich geschwindigkeitskritische Routinen im Programm auf Aufrufe von Bibliotheksfunktionen verlassen. Aber der wichtige Punkt in der obigen Aussage zu betonen ist, dass es marginal schneller sein könnte. Der Geschwindigkeitsunterschied wird fast nicht wahrnehmbar sein, und schwierig, sogar von normalen, erwarteten Schwankungen zu unterscheiden.

Wenn Sie wirklich interessiert, Benchmark und sehen Sie. Aber ich rate, dass dies eine Verschwendung von Zeit ist und dass es effektivere und wichtigere Wege gibt, die Geschwindigkeit Ihrer Anwendung zu erhöhen. Auf lange Sicht wird es Ihnen viel besser gehen, wenn Sie andere Faktoren als die Geschwindigkeit berücksichtigen, wenn Sie die Entscheidung "dynamisch verknüpfen oder statisch verbinden" treffen. Zum Beispiel kann eine statische Verknüpfung in Betracht gezogen werden, wenn Sie Ihre Anwendung einfacher bereitstellen müssen, insbesondere in verschiedenen Benutzerumgebungen. Oder eine dynamische Verknüpfung ist möglicherweise eine bessere Option (insbesondere, wenn diese gemeinsam genutzten Bibliotheken nicht Ihre eigenen sind), da Ihre Anwendung automatisch die Vorteile von Upgrades erwirbt, die an einer der gemeinsam genutzten Bibliotheken vorgenommen werden, ohne dass Sie einen Finger rühren müssen.


EDIT: Microsoft macht die spezifische Empfehlung, die Sie prefer dynamic linking over static linking:

Es wird nicht empfohlen C/C++ Anwendungen zu verteilen, die statisch Link zu Visual C++ Bibliotheken.Es ist oft fälschlicherweise davon ausgegangen, dass durch statisch Ihr Programm mit Visual C++ - Bibliotheken zu verbinden ist es möglich, deutlich die Leistung einer Anwendung zu verbessern. Allerdings ist die Auswirkung auf die Leistung des dynamischen Ladens Visual C++ - Bibliotheken ist in fast allen Fällen unbedeutend . Darüber hinaus ermöglicht statische Verknüpfung nicht Wartung der Anwendung und ihrer abhängigen Bibliotheken entweder von der Anwendung Autor oder Microsoft. Denken Sie für Beispiel eine Anwendung, die statisch mit einer bestimmten -Bibliothek verknüpft ist, die auf einem Clientcomputer mit einer neuen Version dieser Bibliothek ausgeführt wird. Die Anwendung verwendet weiterhin Code von die vorherige Version dieser Bibliothek, und profitiert nicht von der Bibliothek Verbesserungen, wie Sicherheit Verbesserungen. Autoren von C/C++ Anwendungen werden dringend empfohlen, über das Wartungsszenario nachzudenken, bevor Sie entscheiden, zu abhängigen Bibliotheken statisch zu verknüpfen, und dynamisches Verknüpfung wann immer möglich zu verwenden.