gpt4 book ai didi

performance - 为什么 Rust 中的枚举值绑定(bind)这么慢?

转载 作者:行者123 更新时间:2023-12-02 07:16:34 26 4
gpt4 key购买 nike

我目前正在学习 Rust,因为我想在需要非常高性能的项目中使用它。我最初爱上了枚举,但后来我开始评估它们的性能,我发现了一些让我感到困惑的东西。这是一个例子:

use std::time::{Instant};

pub enum MyEnum<'a> {
V1,
V2(&'a MyEnum<'a>),
V3,
}

impl MyEnum<'_> {
pub fn eval(&self) -> i64 {
match self {
MyEnum::V1 => 1,
MyEnum::V2(_) => 2,
MyEnum::V3 => 3,
}
}
pub fn eval2(&self) -> i64 {
match self {
MyEnum::V1 => 1,
MyEnum::V2(a) => a.eval2(),
MyEnum::V3 => 3,
}
}
}


fn main() {
const EXAMPLES: usize = 10000000;
let en = MyEnum::V1{};

let start = Instant::now();
let mut sum = 0;
for _ in 0..EXAMPLES {
sum += en.eval()
}
println!("enum without fields func call sum: {} at {:?}", sum, start.elapsed());

let start = Instant::now();
let mut sum = 0;
for _ in 0..EXAMPLES {
sum += en.eval2()
}
println!("enum with field func call sum: {} at {:?}", sum, start.elapsed());
}

我得到的结果:

enum without fields func call sum: 10000000 at 100ns
enum with field func call sum: 10000000 at 6.3425ms

对于 V1 枚举,eval 函数应该执行与 eval2 完全相同的指令,但它的运行速度要慢大约 60 倍。为什么会这样?

最佳答案

查看程序集,您的第一个循环完全优化为单个 mov 10000000 指令(也就是说,编译器执行的操作等同于 sum += EXAMPLES),而第二不是。我不知道为什么第二个循环没有那么频繁地进行持续优化。

关于performance - 为什么 Rust 中的枚举值绑定(bind)这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61922756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com