2

現在、単純なアプリケーションで速度測定を行っていますが、このプロセス中に、リンカーに /DYNAMICBASE を使用するように指示すると、ランタイムが約 1.5% 短くなることに気付きました。

測定プロセスで 1.5% が間違いやすいことには同意しますが、実際には /DYNAMICBASE で 15 回以上実行し、/DYNAMICBASE:NO で 15 回以上実行しました。各実行は約 5 分です。最速の /DYNAMICBASE:NO 実行でさえ、最も遅い /DYNAMICBASE 実行よりも高速ではありませんでした...

4

1 に答える 1

1

ソリューションが直接的または間接的に多くの DLL を使用している場合、/DYNAMICBASE は、特に依存 DLL に適用された場合に、Windows ローダーの負担を軽減できます。使用されたバイナリがロードされてプロセス アドレス空間に配置されたときに、デフォルトのベース アドレス範囲が衝突した場合、Windows ローダーはそれらをリベースする必要があります。つまり、新しいベース アドレスを決定し、DLL グローバル シンボル呼び出し (データまたは関数) をトラバースしてそれらを変更します。新しい住所へ。多くの (または非常に大きな) DLL の場合、これは起動時間に無視できない影響を与える可能性があります。

デバッガーから実行する場合は、読み込まれたバイナリを [モジュール] ウィンドウで表示し、左側のアイコンを調べて、モジュールがリベースされたかどうかを判断できます。

モジュールウィンドウ

多くの DLL が /DYNAMICBASE によるリベースを回避している場合は、これが原因である可能性があります。/BASE を使用してベース アドレスを直接制御することができます (原則としてそうすべきです)。この利点を偶然に任せてはなりません。

于 2015-09-06T09:41:17.913 に答える