将所有内容放在主体中是否存在性能劣势?
问题描述:
在锈,看来你基本上可以放在任何东西。性状,实现块,函数,静态变量...将所有内容放在主体中是否存在性能劣势?
例如,这个编译:
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编译器是否优化了任何差异?
答
简短回答:没有什么重大的不同。
如果您查看your code on playground的LLVM-IR并将其与code where all of your definitions are outside of main()
进行比较,您会发现在“调试”模式下没有区别(除了命名外)。在“发布”模式下,完全没有任何区别。
但是,测试代码的位置肯定可能影响代码生成。但是这些影响很小。没有什么基础会影响代码生成(例如,如果main
中的定义会隐含引用main
的变量)。
,可能影响代码生成的一些原因:
- 由于
main()
的定义不能的main()
之外使用,这可能是一个强烈的暗示内联函数调用那些东西并删除原来的定义,如果可能的话。这通常会提高性能。 -
rustc
产生稍有不同的LLVM-IR,所以LLVM在理论上可以产生不同的代码(蝴蝶效应) - ...