ベンチマークのスクリプト類は Githubにあります。
ld.gold についてとベンチマークの動機
C++で作業をしているとリンクの遅さがストレスになります。OpenCVみたいな複数の共有ライブラリを作るようなプロジェクトの場合は顕著になります。オブジェクトファイルへのコンパイルは make -j9
のように並列で行えばよいのですが、リンクは並列に行えないためにボトルネックとなります。
2012年ごろに gold
(ld.gold
) というリンカが出てきました。Google発だそうです。現在は binutils
に入っています。既存の ld
に比べて5倍ほど速いそうです。それだけ速いなら常用できないかと試しにベンチマークをとりました。
ベンチマークの方法
-
std::vector<some_type_XXXX>
を使用するオブジェクトファイルを2000個作る - 上記オブジェクトファイルが提供する関数をすべて
main()
で使用する - これらのリンクにかかる時間を
time
コマンドで計測する
使用法と注意
binutils
の一部になっているので gcc
から使用できます。リンク時に -fuse-ld=gold
を指定してください。環境変数LD
にld.gold
を指定してもよいという記事を見かけましたが自分の環境ではうまくいきませんでした。
ld.gold
はELF専用です。Windows用のバイナリ出力などには使用できません。
結果と感想
Core i7-4770 3.40GHz、VMWare上で4コア、16GB RAM、HDD上のUbuntu 14.04。ld
と ld.gold
との相対が重要です。
人工的なコードのせいか ld.gold
の方がだいたい6倍くらい速いです。可能な状況では ld.gold
を使用していきたい気分です。
最近LLVMチームが lld
というリンカを発表したそうです。まだ試すことができていませんが環境が整ったら試したいところです。
# ld の場合(sec)
4.84
4.55
4.56
4.55
4.73
# ld.gold の場合(sec)
0.73
0.72
0.75
0.72
0.73