2 Stimmen

Warum beschleunigt die Verwendung der Linker-Option /DYNAMICBASE meine Anwendung?

Ich führe derzeit einige Geschwindigkeitsmessungen mit einer einfachen Anwendung durch und habe dabei festgestellt, dass die Laufzeit um etwa 1,5 % kürzer ist, wenn ich den Linker anweise, /DYNAMICBASE zu verwenden.

Ich stimme zu, dass 1,5% leicht ein Fehler im Messprozess sein könnte, aber ich habe tatsächlich mehr als 15 Durchläufe mit /DYNAMICBASE und 15 Durchläufe mit /DYNAMICBASE:NO gemacht, jeder Durchlauf dauert etwa 5 Minuten. Nicht einmal der schnellste der /DYNAMICBASE:NO-Läufe war schneller als der langsamste /DYNAMICBASE-Lauf...

1voto

Ofek Shilon Punkte 13077

Wenn Ihre Lösung direkt oder indirekt viele DLLs verwendet, kann /DYNAMICBASE den Windows-Loader entlasten, insbesondere wenn es auf die abhängigen DLLs angewendet wird. Wenn die verwendeten Binärdateien geladen und im Prozessadressraum platziert werden und ihre Standard-Basisadressbereiche kollidieren, muss der Windows-Lader neu gründen d.h. eine neue Basisadresse festlegen und die globalen Symbolaufrufe (Daten oder Funktionen) der DLL durchlaufen und auf die neue Adresse ändern. Bei vielen - oder sehr großen - DLLs kann dies eine nicht zu vernachlässigende Auswirkung auf die Startzeit haben.

Wenn Sie vom Debugger aus starten, können Sie die geladenen Binärdateien im Fenster "Module" anzeigen und das Symbol auf der linken Seite untersuchen, um festzustellen, ob ein Modul neu gebasht wurde:

Modules window

Wenn Sie feststellen, dass viele DLLs ein Rebasing mit /DYNAMICBASE vermeiden, ist dies wahrscheinlich die Ursache. Sie können (und sollten im Prinzip) die Basisadressen mit /BASE direkt kontrollieren und diesen Vorteil nicht dem Zufall überlassen.

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