25

Visual Studio2005には約60のプロジェクトで構成されるかなり大きなC++アプリケーションがあります。現在、リリースモードでリンクするのに7分かかります。時間を短縮したいと思います。リンク時間を改善するためのヒントはありますか?

ほとんどのプロジェクトは静的ライブラリにコンパイルされます。これにより、各プロジェクトに関連する単体テストのセットもあるため、テストが容易になります。静的ライブラリを使用すると、VS2005がインクリメンタルリンクを使用できなくなるようです。そのため、インクリメンタルリンクをオンにしても、毎回フルリンクが実行されます。

サブプロジェクトにDLLを使用すると、違いはありますか?すべてのヘッダーを調べて、シンボルをエクスポートするためのマクロを追加したくはありませんが(スクリプトを使用している場合でも)、7分のリンク時間を短縮するために何かを行う場合は、確かに検討します。

何らかの理由で、コマンドラインからnmakeを使用する方がわずかに高速であり、Linux(GCCを使用)で同じアプリケーションをリンクする方がはるかに高速です。

  • Visual StudioIDE7分
  • コマンドラインからnmakeを使用したVisualC++-5分
  • Linux上のGCC34秒
4

15 に答える 15

19

フラグを使用して/GLプログラム全体の最適化 (WPO)/LTCGを有効にするか、フラグを使用してリンク時のコード生成を有効にしている場合、それらをオフにするとリンク時間が大幅に改善されますが、一部の最適化が犠牲になります。

また、/Z7フラグを使用してファイルにデバッグ シンボルを配置している.obj場合、静的ライブラリはおそらく巨大です。を使用/Ziして個別の.pdbファイルを作成すると、リンカーがディスクからすべてのデバッグ シンボルを読み取れなくなる場合に役立ちます。ベンチマークを行っていないため、実際に役立つかどうかはわかりません。

于 2008-09-28T06:54:48.483 に答える
13

Microsoft での私の提案を参照してください: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=511300

あなたはそれに投票するべきです!これが私の最後のコメントです:

はい、ほとんどのプロジェクトをビルドするためにインクリメンタル リンクを使用しています。大規模なプロジェクトの場合、それは役に立ちません。実際、これらのプロジェクトをインクリメンタル リンクでリンクするには、より多くの時間がかかります (2 分 44 と比較して 2 分 50)。ILK ファイルのサイズが大きい場合は機能しないことがわかりました (最大のプロジェクトでは、win 32 で 262144 KB の ILK が生成されます)。

以下に、リンク時間を短縮するために試みたその他の事項を示します。

  • コードの肥大化を減らすための明示的なテンプレートのインスタンス化。小さなゲイン。
  • IncrediLink (IncrediBuild はコンパイルで興味深い効果をもたらしますが、リンクではほとんど効果がありません)。
  • めったにデバッグされないライブラリのデバッグ情報を削除します (良い結果が得られます)。
  • « Pre-Build Event » で PDB ファイルを削除します (奇妙なことに、3 分 34 秒ではなく 2 分 44 秒の興味深いゲインが得られます)。
  • 多くの静的ライブラリを DLL に変換します。重要なゲイン。
  • ディスクキャッシュを最大化するために、大量の RAM を搭載したコンピューターで作業します。最大の収穫。
  • 大きなオブジェクトと小さなオブジェクト。変わりはない。
  • プロジェクト オプションを変更します (/Ob1、/INCREMENTAL、COMDAT 折りたたみの有効化、マニフェストの埋め込みなど)。興味深い利益をもたらすものもあれば、そうでないものもあります。私たちは継続的に設定を最大化しようとします。
  • 内部リンケージ対外部リンケージを最大化します。これは良いプログラミングの練習です。
  • 余裕がある限り、ソフトウェア コンポーネントを分離します。高速にリンクする単体テストで作業することができます。しかし、まだ相互にやり取りする必要があります。レガシー コードがあり、サード パーティのコンポーネントを使用していました。
  • シークレット リンカー スイッチ /expectedoutputsize:120000000 を使用します。小さなゲイン。

すべての実験で、リンク時間を細心の注意を払って測定したことに注意してください。リンク時間が遅いと、生産性が大幅に低下します。複雑なアルゴリズムを実装したり、困難なバグを追跡したりする場合、このシーケンスを迅速に反復する必要があります: 一部のコードを変更し、リンクし、デバッグをトレースし、一部のコードを変更し、リンクなど...

リンク時間を最適化するもう 1 つのポイントは、継続的インテグレーション サイクルに与える影響です。共通コードを共有する多くのアプリケーションがあり、継続的インテグレーションを実行しています。すべてのアプリケーションのリンク時間は、サイクル時間の半分 (15 分) でした...

スレッドhttps://blogs.msdn.microsoft.com/vcblog/2009/09/10/linker-throughput/では、リンク時間を改善するための興味深い提案がいくつか行われました。64 ビットのコンピューターで、ファイルを完全に RAM で操作するオプションを提供してみませんか?

繰り返しになりますが、リンク時間を短縮するのに役立つ可能性のある提案は大歓迎です。

于 2009-11-20T19:31:13.383 に答える
5

一般に、静的ライブラリの代わりにDLLを使用すると、リンク時間が大幅に改善されます。

于 2008-09-27T15:40:21.257 に答える
4

XoreaxによるIncredibuildを見てください。その分散コンパイルにより、完全なビルド/リンク時間が約40分から8分に劇的に短縮されました。

さらに、この製品にはIncredilinkと呼ばれる機能があり、静的にリンクされたライブラリでもインクリメンタルリンクを機能させるのに役立ちます。

于 2008-09-27T16:01:49.723 に答える
2

DLLへの変換は役に立たないと思います。最適化を行うためのオプションを探して、それらをオフにしてみることができます。リンカは、削除できる冗長なコードがないかライブラリを調べるのに長い時間を費やしている可能性があります。あなたのアプリは大きくなったり遅くなったりするかもしれませんが、それはあなたにとって問題ではないかもしれません。

于 2008-09-27T15:37:34.680 に答える
2

偶然に、ほとんどすべての(静的)ライブラリにインクルードされたヘッダーファイルに文字列の大きなテーブルを定義していたことがわかりました。(私は巨大なC ++プロジェクトについて話しています。)リンカーがEXEを作成したとき、テーブルの統合(EXEで終わるのは1つだけです)またはライブラリの解析に永遠にかかったように見えます。テーブルを別のC++ファイルに配置するには、比較的低速のマシンでリンクに数分かかりました。

残念ながら、偶然以外にそのようなものを見つける方法がわかりません。

于 2009-10-26T00:30:30.050 に答える
2

デバッグ ビルドの場合は、インクリメンタル リンクを使用できます。これにより、リンク時間が大幅に短縮されます。

悲しいことに、いくつかの落とし穴があり、VS2005 は警告しません。

  • スタティック ライブラリを使用している場合、スタティック ライブラリのファイル部分を変更すると、インクリメンタル リンクは機能しません。解決策は、リンカー オプションの [Use Library Dependency Inputs] を [Yes] に設定することです (これは、VS2003 の Fast Solution Build と同じです)。

  • pragma-comment-lib を使用して DLL の lib をインクルードし、lib だけではなく相対パスを指定すると、インクリメンタル リンクが機能しなくなります。解決策は、lib のみを指定し、linker-option LIBPATH を使用して追加の lib-path を追加することです。

  • 場合によっては、.ilk ファイルが破損し (200 MB を超える)、インクリメンタル リンカに通常の 10 倍以上の時間がかかることがあります。.ilk ファイルが破損しているというエラーが表示されることがありますが、通常は数分後に最初に表示されます。私にとっての解決策は、「ビルドイベント」->「リンク前イベント」に次のコマンドをセットアップすることでした

    for %%f in ($(IntDir)*.ilk) do ( if "%%~zf" GTR "200000000" (del %%f))

于 2009-11-17T12:56:43.240 に答える
2

静的にリンクされたライブラリ内のファイルを変更すると、ソリューション全体のインクリメンタル リンクが無効になると何人かが報告しています (そして私自身も気付いています)。これはあなたが見ているもののようです。それに関するいくつかの情報については、ここここのコメントを参照してください。

1 つの回避策は、高速ソリューション ビルドアドインを使用することです。これには、ワークスペースにいくつかの変更を加える必要があるかもしれませんが、見返りは間違いなく価値があります. 商用ソリューションの場合は、Xoreax のIncredibuildを使用します。これは、基本的にこれと同じテクノロジを組み込んでいますが、他の機能も追加しています。Incredibuild のセールスマンのように聞こえたら申し訳ありませんが、私は非常に満足している顧客です。

于 2008-09-27T20:13:12.880 に答える
2

以前、大規模なアプリを Visual C++ にリンクする際に同様の問題が発生しました。私の場合、十分な空き RAM がなかっただけで、ディスクへの過剰なページングにより、リンク プロセスが停止してしまいました。RAM を 1GB から 2GB に倍増すると、劇的な改善が見られました。開発ボックスはどれくらい稼働していますか?

于 2008-09-28T04:05:26.300 に答える
1

リンクする60ライブラリはかなりの数のように聞こえます。これは少し極端な手段かもしれませんが、それは物事を根本的にスピードアップするかもしれません。いくつかのプロジェクトで新しいソリューションを作成し、既存のプロジェクトのすべてのソースをこれらに追加します。次に、代わりにそれらをビルドしてリンクし、テスト用に小さいものを保持します。

于 2008-09-27T15:30:19.330 に答える
1

複数のプロセッサを搭載したより高速なコンピュータを入手し、並列ビルドを有効にします(これはデフォルトでオンになっている可能性があります)。最大限のパラリズムを可能にするには、プロジェクトの依存関係が正しく、不要な依存関係がないことを確認してください。

于 2008-09-27T15:34:10.490 に答える
1

これを見てみることができます:http://msdn.microsoft.com/en-us/library/9h3z1a69.aspx

基本的に、コアが複数ある場合は、プロジェクトのビルドを並行して実行できます。

于 2008-09-28T04:08:18.510 に答える
1

本当にリンク時間について話しているのであれば、高速なソリューション ビルドや Xoreax などはあまり役に立ちません (Incredilink を除いて、そうなる可能性があります)。リンクの開始からリンクの終了までを本当に測定していると仮定すると、所有しているライブラリの数が問題になることをお勧めします。

リンク フェーズは、少なくとも最初は、すべてのオブジェクト ファイルと lib ファイルをロードする際に IO バウンドです。多数の .obj ファイルのメイン プロジェクトと共に 60 のライブラリがある状況にある可能性があります。これらの libs および .obj ファイルをすべてロードする際に、少なくとも部分的には典型的な Windows の遅さを単に見ているのではないかと思います。

これは簡単にテストできます。これらの lib ファイルをすべて取り、テストとして 1 つの lib ファイルをビルドします。それらのうちの 60 とリンクする代わりに、1 つとリンクして、あなたの時間がどこに行くかを見てください。それは興味深いでしょう。

NTFS は遅いことで知られています。Linux では 7m 対 32 秒では遅いはずですが、問題の一部である可能性があります。DLL を使用すると役に立ちますが、アプリケーションの起動に時間がかかりますが、それほど早くはありません。アプリケーションの起動時間は 700 万時間もかからないと確信しています。

于 2008-09-28T00:29:22.107 に答える
1

リンクの問題を解決し、皆さんに共有しました。

私のプロジェクトのリンク時間は /Incremental:no linking (リンク時間 7 分) で 7 分でした。

/Incremental では 15 分でした (リンク時間 7 分、埋め込みマニフェスト時間 7 分)。だから私はインクリメンタルをオフにします。

追加の依存関係には.libがあり、特定のライブラリも無視することがわかりました!

したがって、特定のライブラリを無視して/インクリメンタルをオンにすることから削除します。最初のリンク時間は 5 分必要ですが、埋め込まれたマニフェスト時間はありません。

理由はわかりませんが、インクリメンタル リンクは機能しています。

すべてのプロジェクト コードをロールバックしたので、ライブラリで問題を見つけることができました。上記のすべてを行う場合は、私の方法を試すことができます。幸運を!

于 2012-03-16T07:06:27.993 に答える
0

C++ ビルド時間短縮のステップ 1 は、メモリの増加です。4GB から 12GB に切り替えた後、すべてのプロジェクトをリンクする時間が崖から落ちるのを見ました: 5:50 から 1:15 へ。

于 2012-03-22T17:27:33.557 に答える