[英]Why enum value binding in Rust is so slow?
我目前正在学习 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
eval function 应该执行与用于 V1 枚举的 eval2 完全相同的指令,但它的工作速度慢了大约 60 倍。 为什么会这样?
查看程序集,您的第一个循环完全优化为单个mov 10000000
指令(即,编译器执行与sum += EXAMPLES
等效的操作),而第二个则不是。 我不知道为什么第二个循环没有进行大量的持续优化。
正如人们所期望的那样,我认为性能没有差异。
$ ./test
enum without fields func call sum: 10000000 at 307.543596ms
enum with field func call sum: 10000000 at 312.196195ms
$ rustc --version
rustc 1.43.1 (8d69840ab 2020-05-04)
$ uname -a
Darwin Windhund.local 18.7.0 Darwin Kernel Version 18.7.0: Mon Feb 10 21:08:45 PST 2020; root:xnu-4903.278.28~1/RELEASE_X86_64 x86_64 i386 MacBookPro15,2 Darwin
一个问题可能是使用简单的“挂钟”时间进行基准测试。 这个简单的时间计算很容易受到任何可能消耗资源的运行的影响。 防病毒,web 浏览器,任何程序。 相反,使用基准测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.