2016-05-21 24 views
2

フォローアップRust minimal compiled program sizeなぜRustはgcc/clangより5〜10倍遅い単純なプログラムをコンパイルしますか?

rustc hello.rs 
> 600 ms 

なぜrustcは、GCC /打ち鳴らすよりも遅く、簡単なHello Worldの5-10時間をコンパイルしていますか?

ルストはLLVMを使用しているため、clangと同等である必要があります。とにかく、3行のコードしかないプログラムについて話しています。

rustc hello.rs -C opt-level=0 -C prefer-dynamic 
> 400 ms 

gcc hello.c 
> 60 ms 

gcc hello.c 
> 110 ms 
+0

私は推測している型チェックと借り入れチェック。 'println!'は単純な関数呼び出しであるCの 'printf'とは異なり、かなり複雑なコードに展開されることにも注意してください。 – kennytm

+1

@kennytm、1行のコードをタイプチェックするには500 ms? – exebook

+1

[this](https://www.reddit.com/r/rust/comments/2uxt46/rust_vs_c_inc_compile_speed/)のディスカッションを見て、この[コンパイル時](https://ruudvanasseldonk.com/2014/10)を見てください。/20/writing-a-path-tracer-in-rust-part-7-conclusion)をC++プログラムのRustに移植しました。 – malbarbo

答えて

16

まず第一に、私はそれが2つの非常に簡単なプログラムのコンパイル時間を比較することは非常に有意義だと思うし、その結果は、より一般的に二つの言語間のコンパイル時間の代表であることを期待しないでください。

Rustは、実行時パフォーマンスのコストがほとんどまたはまったくない高水準言語に共通する抽象レベルを提供する言語であるため、ある程度コンパイル時にそれを支払う必要があります。

この抜粋はthe Rust FAQから取られる:

錆コンパイルが遅いようです。何故ですか?

コードの変換と最適化。 Rustは高レベルの の抽象化を効率的なマシンコードにコンパイルし、それらの翻訳は特に最適化の実行に時間がかかります。

しかし、Rustの編集時間はそれほど悪くないようであり、改善すると信じる理由は です。同様の サイズのプロジェクトをC++とRustの間で比較すると、プロジェクト全体のコンパイル時間は一般的には同等であると考えられる です。 Rust のコンパイルが遅いという一般的な認識は、C++とRustの間の コンパイルモデルの違いの大部分が原因です.C++のコンパイル単位は です.Rustは多くのファイルで構成されています。したがって、 の開発中に、単一のC++ファイルを変更すると、Rustの場合よりもはるかに少なくなります。 コンパックが リファクタリングを進めていくインクリメンタルコンパイルを導入する大きな努力があります。 はC++のモデルのコンパイル時のメリットを提供します。

コンパイルモデルとは別に、 コンパイル時のパフォーマンスに影響を及ぼすRustの言語設計とコンパイラの実装があります。

まず、Rustは適度に複雑な型のシステムを持ち、 が実行時に安全になるという制約を適用して無視できる量のコンパイル時間を費やす必要があります。

第2に、Rustコンパイラは長年の技術的負債である に悩まされており、特にLLVMが時間を費やさなければならない低品質のLLVM IRを生成します。 "fix"将来のMIRベースの最適化と の変換パスにより、Rustコンパイラが負担を軽減することが期待されます。 LLVM。

は第三に、コード生成のためのLLVMの錆の使用は両刃の の剣である:それは世界トップクラスの実行時のパフォーマンスを持っている錆を可能にしながら、 LLVMは、コンパイル時 パフォーマンスに焦点を当てていない大規模なフレームワークであり、特に品質の低い入力を扱う場合は特にそうです。

最後に、Rustの一般的なモノラル化の戦略である (ala C++)は高速なコードを生成しますが、他の翻訳方法よりもかなり多くのコード を生成する必要があります。錆のプログラマは 動的オブジェクト ディスパッチを使用して、このコードを拡張するために特性オブジェクトを使用できます。

関連する問題