2009-06-30 34 views
13

私はよくC#のコンパイル速度を賞賛します。これまで私はわずかなアプリケーションしか作っていませんでしたが、実際にはコンパイルが非常に高速だったことに気付きました。しかし、これが依然として大きなアプリケーションのために保持されているのだろうかと私は思っていました。大きなC#プロジェクトは、同様のサイズのC++プロジェクトよりも速くコンパイルされますか?C#と比べると大きなプロジェクトのコンパイル時間

+2

私も同じことを思っていました。私はC#で小さなアプリケーションをコンパイルし、コンパイルはC++に比べて驚くほど高速でした。 – Naveen

+0

私はPIVでコンパイルするのに長い時間(約1分)かかった40以上のプロジェクトを作成しました(私は作成しませんでした)。私のPCをCore 2にアップグレードすると、コードをより少数のプロジェクトにリファクタリングするように、受け入れられる時間が大幅に短縮されました。 C#プロジェクトのコンパイル時には、多くのプロジェクトを持つことになります。 – RichardOD

答えて

5

私の経験から言うと、C#はC++プロジェクトよりもはるかに高速にコンパイルできます。大規模なアプリケーションであっても

これは、C#がC++よりも言語としてあまり複雑ではなく、C#がIL(機械コードに後で最適化され翻訳される)に変換され、C++が機械語。

10

はい、C#は通常、より高速にコンパイルします。必ずしも十分速くはありません。私の最大のC#コードベースには、たくさんのプロジェクトを含む100万行のコードがあり、コンパイルするのに約1時間かかりました。しかし、私はこの時間の多くが、ビジュアルスタジオの不十分なビルドシステムに起因すると考えています。 一方、C++のコンパイル時間は通常より長くなりますが、コードの編成方法にはより多くの依存性があります。ヘッダーファイルの依存関係の扱いが悪いと、コンパイル時間が数桁増加しやすくなります。

+4

+ 1ヘッダーファイルを整理することで、巨大なC++プロジェクトで1時間から8分に短縮しました! –

6

C++は、ヘッダファイルをインクルードするたびに再読み込みして再解析する必要があるため、コンパイルが非常に遅いです。 "#defines"の仕組みのせいで、コンパイラがすべてのヘッダファイルを自動的にあらかじめコンパイルすることは非常に難しいです。 (Modula-2はこれよりはるかに優れていました。)多くのC++プロジェクトでは、コンパイルされたC++ファイルごとに100秒のヘッダを読み込むのが普通です。

時々、インクリメンタルなC++コンパイルは、C#よりもずっと高速になります。すべてのC++ヘッダーファイル(およびデザイン)が非常に良い状態にある場合(Large-Scale C++ Software DesignEffective C++など)ほとんどのシステムで使用されるクラスの実装を変更し、1つのdllを再コンパイルするだけです。

クラスの移植を変更するたびにC#に別のヘッダーファイルがないため、クラスのパブリックインターフェイスが変更されていない場合でも、クラスの使用はすべて再コンパイルされます。これは、 "インターフェイスベースのプログラミング"と "依存性注入"などを使用してC#で削減することができます。しかし、それはまだ痛みです。

しかし、全体的に私はC#のコンパイルが十分速いが、大規模なC++プロジェクトのコンパイルは非常に遅いため、再構築の時間のために「基本クラス」にメソッドを追加したくないと感じている。

各クラスにいくつかのクラスがあるVisual Studioプロジェクトがたくさんあるので、C#の作成が遅くなる可能性があります。関連するプロジェクトをまとめて結合し、名前空間にプライベートなクラスを使用しないように開発者を「信頼する」ことは、時には大きなメリットがあります。 (nDependsは、ルールを破る人のチェックに使用できます)

(私がFileMonのコンパイルを高速化しようとすると、私はFileMonが非常に役に立ちました。したがって、コンパイル済みのヘッダーファイルにSTLを追加するだけで大​​きな違いが生まれました。したがって、ビルド時間を追跡して、遅くなったら調査してください)

+0

+ 1あなたはライブラリの実装を変更するときだけリビルドを必要とする依存プロジェクトでC#の問題を指摘します。 C++はインターフェイスを実装から明確に分離する上でより良い仕事をしますが、実際には大きなプロジェクトに適しています。依存性注入は、コードベース全体を準拠した形で、すなわち侵襲的に書き直すことを強制するため、回避策に過ぎない。 –

3

C#はC++よりもはるかに高速です。主な理由の1つは、ヘッダーがないため、もちろんC#でヘッダーにする必要はないテンプレートです。しかし、テンプレート(Boostのようなほとんどすべての現代のC++ライブラリ)を多用していると、C++でのコンパイル時間が長くなります。

関連する問題