将所有东西都放在主要位置有任何性能劣势吗?

时间:2017-09-09 22:26:28

标签: performance optimization rust main

在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编译器能否优化差异?

1 个答案:

答案 0 :(得分:7)

简短回答:没有什么重大意义

如果您查看your code on playground的LLVM-IR并将其与code where all of your definitions are outside of main()进行比较,您会发现“调试”模式下没有差异(除了命名)。在“发布”模式下,根本没有任何差异。

但是,测试代码的位置肯定可能会影响代码生成。但这些都是次要影响。没有什么基础可以影响代码生成(例如main中的定义是否会隐含引用main的变量)。

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

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