Performance 将所有内容都放在main中是否存在性能劣势?

Performance 将所有内容都放在main中是否存在性能劣势?,performance,optimization,rust,main,Performance,Optimization,Rust,Main,在《铁锈》中,你似乎基本上可以把任何东西放在主容器中。特性、实现块、函数、静态变量 例如,这将编译: fn main() { trait Foo { fn foo(); } impl Foo for f64 { fn foo() {} } struct MyStruct; enum RustIsCool { MyStruct, }; fn bar() { tra

在《铁锈》中,你似乎基本上可以把任何东西放在主容器中。特性、实现块、函数、静态变量

例如,这将编译:

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编译器会优化任何差异吗?

简短回答:没有显著差异

如果您查看LLVM-IR并将其与进行比较,您将看到在“调试”模式下没有差异(由于命名的原因除外)。在“释放”模式下,根本没有任何区别

但是,测试代码的位置当然可能会影响代码生成。但这些都是次要影响。没有任何基本要素会影响代码生成(例如,
main
中的定义会隐式引用
main
的变量)

可能影响代码生成的一些原因:

  • 由于
    main()
    中的定义不能在
    main()
    之外使用,因此这可能是对这些内容的内联函数调用的强烈提示,并在可能的情况下删除原始定义。这通常会提高性能
  • rustc
    生成的LLVM-IR略有不同,因此理论上LLVM可以生成不同的代码(蝴蝶效应)