-1

如果一个变量在文件中的多个函数中使用,将其定义为静态而不是通过函数参数传递非静态变量会更好吗?这对性能有影响吗?

使用静态变量的示例:

lazy_static! {
    static ref FOO: Foo = {
        Foo::new()
    };
}

fn main() {
    do_foo();
    do_another_foo();
}

fn do_foo() {
    FOO.bar();
    // ...
}

fn do_another_foo() {
    let name = FOO.name();
    // ...
}

使用普通变量的示例:

fn main() {
    let foo = Foo::new();
    do_foo(&foo);
    do_another_foo(&foo);
}

fn do_foo(foo: &Foo) {
    foo.bar();
    // ...
}

fn do_another_foo(foo: &Foo) {
    let name = foo.name();
    // ...
}
4

1 回答 1

0

如果您使用lazy_static!,每次访问变量时都会产生相当多的开销。顾名思义,lazy_static!var 是惰性初始化的(按需)。这意味着每次尝试读取静态变量时,都会检查以确保变量已初始化或相应地对其进行初始化。

lazy_static!可能会比通过函数参数传递变量慢很多。

还有conststatic关键字。在const关键字的情况下,值在使用 const 的地方内联(#define在 C++ 中思考)。在static关键字的情况下,二进制文件中只有 1 个内联变量实例。引用该static变量就像是指向部分二进制文件的指针。

如果可能,这两个选项都会比使用更快lazy_static!

此外,通过编译器优化,函数很可能是内联的。然后编译器可以优化掉参数传递。然后根本不会有任何传递参数的开销。

我猜想函数参数与const/差不多static

也就是说,通常更喜欢通过函数参数传递状态而不是使用全局状态。全局状态往往会导致代码混乱,从而导致性能不佳。

于 2020-11-10T23:14:00.077 回答