簡體   English   中英

為什么 Rust 中的枚舉值綁定這么慢?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM