ランセンスやコンパイル時間が短いということもあって、デフォルトのコンパイラをGCCからLLVM Clangに切り替えるプロジェクトやベンダーが増えている。しかし、GCCもコンパイル時間の短縮やエラーメッセージの改善を進めるなどの取り組みが進められている。一方、対応するアーキテクチャの少なさやOpenMP対応の弱さが指摘されていたLLVM Clangだが、現在ではどちらもかなり対応が進んでいる。実際のところ両者の関係はどうなっているのだろうか。

オペレーティングシステムやコンパイラのベンチマーク比較をよく掲載しているPhoronixはこのほど、「LLVM Clang 3.9 Mostly Trails GCC In Compiler Performance|Phoronix」において、LLVM Clang 3.9.0、3.8.0、GCC 7.0.0 20160904、6.2.0、5.4.0のベンチマーク結果から、特に差の大きなものを伝えた。それぞれのコンパイラの性能を見る上で参考になる。

Clang 3.9.0はいくつかの項目でClang 3.8.0の性能を上回っているが、逆に性能が劣化している項目も出ている。これはGCCでも同じで、GCC 7.0.0 20160904よりもGCC 5.4.0のほうが優れている項目がある。ClangとGCCは項目によって性能が分かれる傾向があり、特定の項目でGCCのほうが性能がよく、またほかの項目ではClangのほうが性能がよいといった傾向を見せている。

コンパイル時のオプションは-O3 -march=nativeとされている。それぞれのコンパイラが苦手とされる部分の実装や改善を進めたことで開発が着手された部分の進展は見られるものの、性能面では特定の部分でリグレッションが発生している。生成後バイナリの性能を特に重要視するのであれば、実際に複数のコンパイラでビルドしたものを実行して性能を測定することが望ましいと見られる。

(後藤大地)