[英]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.