2012-04-02

Cコンパイラーの比較

Willus.com's 2011 Win32/64 C Compiler Benchmarks

これはすごい。Windows上で動くCコンパイラーを様々な面から比較している。ベンチマークに使ったソースコードは、すべて純粋なC言語である。アセンブリやインラインアセンブリは無効にしてある。これは純粋なCコンパイラーの性能を図るためだからだ。

まず、コンパイラー自体の問題がある。Intelのコンパイラーは、デブすぎるにもほどがある。Intelのパッケージだけで1.6GiBもあるのに、これにさらにVisual Studioを別途インストールしなければ使えない。さらに、Intelのインストーラーは40個以上もの別個のソフトウェアをインストールする。それぞれ、バッチスクリプト用にPATHを追加するので、PATH環境変数に何十個も追加されることになる。Windows 7では、インストール済みのソフトウェアのソートができるが、この時ほど便利だと思ったことはない。インストールすると10GiBぐらいのディスク容量を食う。ちなみに、Intelのコンパイラーをアンインストールするには、リアルで10分もかかった。これと対極にあるのはTCCだ。小さい!

次に、いくつかのコンパイラーは、巨大な静的配列のコンパイルに問題を抱えている。特に、Digital MarsやMSVCは1990年代に生きているらしく、64KiB以上の文字列リテラルが静的に初期化できない。Digital Marsは3MiB以上もの文字配列を使っているコードをコンパイルしようとするとメモリが不足する。コンパイラーは32bitコードだから、2GiBのメモリが使えるはずであるのにも関わらずだ。

今回試したコンパイラーでC99をサポートしているのは、gccとIntelだけなので、x264のテストはこのコンパイラーでしか行えない。

実行時のパフォーマンスが一番良かったのは、Intelのコンパイラーである。ただし、2002年と比べて、Intelの優位性は下がっている。自動的な並列化は、Intelの圧勝となっている。gccはこの点で大きく遅れている。gccの自動的な並列化は、並列化させるための意図的なコードを書いてようやく発現させられるレベルである。また、プロファイルによる最適化は、Intelでは明白なパフォーマンスの向上がある。gccでは、パフォーマンス向上はほとんどない。また、64bitコードへのコンパイルは、全体的にパフォーマンスを上げる。ただし、MSVCでは何故かパフォーマンスが下がる場合があるのだが。

No comments: