[解決済み】スタティックリンクとダイナミックリンクの比較
質問
特定の状況において、動的リンクではなく静的リンクを選択する、あるいはその逆を選択する、説得力のあるパフォーマンス上の理由はあるのでしょうか?次のようなことを聞いたり読んだりしたことがありますが、その信憑性を保証できるほど、このテーマについて詳しくありません。
1) スタティックリンクとダイナミックリンクの実行時性能の差は、通常無視できるほど小さいです。
2) (1)は、プロファイルデータを使用してプログラムのホットパスを最適化するプロファイリングコンパイラを使用している場合は当てはまりません。なぜなら静的リンクでは、コンパイラはあなたのコードとライブラリのコードの両方を最適化することができるからです。ダイナミックリンクの場合は、自分のコードだけが最適化されます。ライブラリコードの実行にほとんどの時間を費やしている場合、これは大きな違いとなり得ます。それ以外の場合は、(1)が適用されます。
解決方法は?
- ダイナミック リンクは 総リソース消費量の削減 (複数のプロセスが同じライブラリ(もちろん"the same"のバージョンも含む)を共有する場合)です。これが、ほとんどの環境での存在を後押ししている議論だと思います。ここで、"resources"には、ディスクスペース、RAM、キャッシュスペースが含まれます。もちろん、ダイナミックリンカーの柔軟性が不十分な場合、以下のようなリスクがあります。 DLL地獄 .
- ダイナミック リンクはバグフィックスとライブラリのアップグレードを意味します。 伝搬する を改善するために あなたの を出荷する必要がありません。
- プラグイン を常に呼び出します。 ダイナミック をリンクさせる。
- 静的な リンクは、そのコードが非常に短い時間で実行されることを意味します。 限られた環境 (ブートプロセスの初期やレスキューモード)。
- 静的な リンクはバイナリを作ることができる 配布しやすい を多様なユーザー環境に送ることができます (その代償として、より大きく、よりリソースを消費するプログラムが送られます)。
- 静的な のリンクは、若干の 起動が速い しかし、これはプログラムのサイズと複雑さにある程度依存します。 と OSのロード戦略の詳細に関するものです。
コメントや他の回答で非常に関連性の高い提案を含むように、いくつかの編集を行いました。私は、あなたがこれを破る方法は、あなたがどのような環境で実行する予定であるかに大きく依存することに留意したいと思います。最小限の組み込みシステムは、ダイナミックリンクをサポートするのに十分なリソースを持っていないかもしれません。少し大きめの小型システムは、メモリが十分に小さいため、ダイナミックリンクによる RAM 節約が非常に魅力的であるため、ダイナミックリンクをサポートする可能性があります。本格的なコンシューマー向けPCでは マーク注釈 この問題については、利便性の問題から考えてもよいでしょう。
性能と効率の問題を解決するために。 場合による .
古典的に、動的ライブラリは、しばしば二重ディスパッチや関数アドレスの間接化の余分な層を意味し、少し速度を犠牲にすることができるいくつかの種類の接着層を必要とします(しかし、関数呼び出し時間は実際に実行時間の大きな部分を占めていますか?)
しかし、複数のプロセスを実行し、それらがすべて同じライブラリを頻繁に呼び出す場合、ダイナミック・リンクを使用すると、スタティック・リンクを使用する場合と比較して、キャッシュ・ラインを節約できる(つまり実行性能で勝てる)ことになるのです。(最近の OS が、静的にリンクされたバイナリの同一セグメントに気づくほど賢くない限り)。難しいような気がしますが、どなたかご存知でしょうか?)
もう一つの問題は、ロード時間です。ある時点で読み込みコストを支払うことになります。このコストをいつ払うかは、OSの仕組みや、どんなリンクを使うかによって変わってきます。必要だとわかるまで、支払いを先延ばしにしたほうがいいかもしれませんね。
なお、スタティック-ダイナミックリンクは、伝統的に ではなく というのも、どちらもオブジェクトファイルまで個別にコンパイルする必要があるからです。コンパイラは原理的に、静的ライブラリを最初に AST 形式にコンパイルし、その AST をメインコード用に生成されたものに追加することでリンクさせることができますので、全体最適化が可能になります。私が使っているシステムでは、このようなことは行われていませんので、どの程度うまく機能するかについてはコメントできません。
パフォーマンスに関する質問の答え方は 常に は、テストによって(そして、できるだけデプロイ環境に近いテスト環境を使用する)。
関連
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] スタティック・ライブラリとシェアード・ライブラリの違い?
-
[解決済み] ダイナミックライブラリとスタティックライブラリの使い分け
-
[解決済み】共有オブジェクト(.so)、静的ライブラリ(.a)、DLL(.so)の違い?)
-
[解決済み] 共有ライブラリを動的リンクした場合、共有ライブラリ内のグローバル変数とスタティック変数はどうなりますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] アプリケーション・バイナリ・インターフェース(ABI)とは何ですか?
-
[解決済み] スタティック・ライブラリとシェアード・ライブラリの違い?
-
[解決済み】ライブラリ?静的?ダイナミック?それともフレームワーク?プロジェクトの中に別のプロジェクトがある