2010-12-29 21 views
12

g ++とldにリンクするのに約8秒かかるプロジェクトがあります。C++のリンク時間を短縮するヒント

これは静的ライブラリの束を使用しています。ほとんどのコードはC++です。

私はリンク時間を短縮する方法のヒントの一般的なリストに興味があります。あなたはそれが長いことを取るべきではないと本当に確信している場合を除き

+1

[リンクタイムコード生成](http://gcc.gnu.org/wiki/LinkTimeOptimization)を使用していますか?より速いコードが生成されますが、リンク時間が長くなります。 –

+1

8秒が速いです。それは心配するようにはあまり聞こえません。プロジェクトの規模はどれくらいですか? –

+1

プラットフォームとコンパイラ? GCCとbinutilsでは、[gold](http://sourceware.org/ml/binutils/2008-03/msg00162.html)は(classic)ldよりも高速で、[clang](http://clang.llvm .org /)は、それより速く(またはそうでないかもしれない)。 – ephemient

答えて

8

私は前の仕事で何年もこれを扱っていました。 GNUリンカは、多数の静的ライブラリをリンクするときに、単に重大なパフォーマンス上の問題があります。ある時点では、リンク時間はコンパイル時と同程度でしたが、私たちは実際にこれを調査して奇妙なことを発見しました。

リンクする前に、スタティックライブラリを「スーパーオブジェクト」にマージしてみることができます。代わりに、次のようにリンクする:

$ g++ -o program program.o $STATIC_LIBS 

あなたはこれを試みることができる:このメソッドは、未使用のオブジェクトコードを除外するために、リンカ少ない機会を与えることを

$ ld -r -o libraries.o --whole-archive $STATIC_LIBS 
$ g++ -o program program.o libraries.o 

注意を、あなたのバイナリがややサイズが大きくなる場合もございます。

+0

このメソッドをC++コードに使用する場合は、 '-r'の代わりに' -Ur'スイッチが必要な場合があります( 'ld'のドキュメントを参照してください) – anatolyg

+0

C++コードの-Urのosxソリューションはありますか? osx10.6で認識されないようです--Ur –

+0

これを見ると、まず依存関係をリンクするとパフォーマンスが向上するのだろうかと思います。 – Alex

2

8秒を「少ないスパゲッティコードを作る」ために、「デバッグシンボルが含まいけない」から ものは、かなり速いです。私はリリースビルドで増分リンクをしないので、フル再リンクのために5〜8分かかるプロジェクトがあります。インクリメンタルリンクを使用しようとしましたか(-sharedを使用していない場合は、-iまたは-rを使用できます)。

+3

5-8分はまだガゼルのように見えます。 –

+0

@Martin:そうではありませんが、私は、ブースト、GMP、その他の厄介なライブラリを使って、良いデザイン、discc(8サーバ)、高速ディスクなど、コードベース全体の完全なビルドを使用して、1.2mill LOC C++コードベースで作業しますテストを含む)は、gcc 4.4を使って約2-2.5分かかります - だから、8分を取るには、実際にはあまり書いてないか、巨大なコードベースでなければなりません。 –

+7

または高速サーバーで実行されていません... – Jay

2

(少なくとも開発中は)プログラム全体の最適化をオフにします。依存関係を減らすためにp-implを使用してください。

+1

は、* compile * timeを減らすためにp-implではありませんか? – Simone

+1

@ Simone:p-implは、あるクラスの実装を変更すると、すべてのコンシューマではなくそのコンパイル単位のみを再コンパイルする必要があることを意味します。コンパイル単位の変更が少なくなれば、増分リンクはより効果的になります。 –

0

デバッグビルドを共有ライブラリとしてコンパイルするのはどうですか?これは、インポートライブラリがデバッグ情報の有無にかかわらず、デバッグシンボルbloatを解決します。多分最高の解決策ではないかもしれませんが、これはリンク時間を大幅に短縮すると考えています...

+0

彼は具体的に共有ライブラリが出ていたと言った。そして私は彼に同意します - 近代的なシステムでは、共有ライブラリは多くの潜在的な問題を追加し、あなたにいくつかの利点を与えます。 –

+0

@TomSwirly彼は共有ライブラリに反対しているとは言えません。 – rubenvb

2

RAMディスクを作成し、コンパイルしてハードディスクにリンクします。

多くの静的ライブラリを使用しているので、すべてのライブラリを含む巨大なライブラリを作成して1つのライブラリにすることができます。 lib-listからすべてのライブラリを削除し、大きなリストを追加してください。これにより、ライブラリのファイルオープンが1に減少し、読み込み動作が高速化される可能性があります。

+0

私たちは1980年代に使用したRAMディスクではありませんか? – anatolyg

+1

@anatolyg:はい、それでもハードディスクには勝っています。 –

+0

彼はSSDを持っています! –

関連する問題