2017-09-09 4 views
4

Rustでは、基本的に何かをメインに置くことができます。トレイト、実装ブロック、機能、静的変数...すべてをメインに置くことにパフォーマンス上の欠点はありますか?

例えば、これはコンパイル:

fn main() { 
    trait Foo { 
     fn foo(); 
    } 

    impl Foo for f64 { 
     fn foo() {} 
    } 

    struct MyStruct; 

    enum RustIsCool { 
     MyStruct, 
    }; 

    fn bar() { 
     trait Baz { 
      fn baz(); 
     } 

     impl Baz for f64 { 
      fn baz() {} 
     } 
    } 

    static x: f64 = 10.0; 

    println!("This compiles!"); 
} 

あなたが見ることができるように、次のことが可能にも巣をこれらの事他のブロックの内側。

明らかに、これを行うことは文体的な観点からは悪いことです。それは醜いですし、リファクタリングするのが難しく、コードの再利用が難しくなります。

しかし私は不思議です:これを行う際にパフォーマンス上のオーバーヘッドはありますか?あるいは、Rust Compilerは相違を最適化しますか?

答えて

7

短い回答:重要でないものはありません

あなたはyour code on playground用LLVM-IRを見て、code where all of your definitions are outside of main()と比較した場合、あなたは「デバッグ」モードで(命名によるものを除く)に差がないことがわかります。 「リリース」モードでは、何の違いもありません。

ただし、テストコードの場所がコード生成に影響する可能性があります。しかし、これはマイナーな影響です。 mainの定義がmainの変数への暗黙の参照を持つ場合など、コード生成に影響を与える必要がある基本的なことは何もありません。

おそらくコード生成に影響を与える可能性があるいくつかの理由:

  • main()の定義はmain()の外で使用することはできませんので、これは関数をインラインするための強力なヒントは、それらのものに呼び出すことが、元の定義を削除することができ、可能なら。これにより、一般的にパフォーマンスが向上します。 LLVMは、理論的に異なるコード(バタフライ効果)
  • を生成できるよう
  • rustcは...、わずかに異なるLLVM-IRを生成
関連する問題