布尔值的`if let`和`if`之间是否有任何性能差异?

时间:2017-07-06 17:17:58

标签: if-statement rust

例如:

let mut v = vec![2, 3, 4];
if let false = v.is_empty() {
    v.push(5);
}

VS

let mut v = vec![2, 3, 4];
if !v.is_empty() {
    v.push(5);
}

我的直觉是,它是微不足道的,无所谓。

1 个答案:

答案 0 :(得分:4)

对于任何效果问题,您需要分析以确定。除此之外的任何事情都在猜测。

然而,作为第一级猜测,您可以查看生成的程序集:

#![crate_type="lib"]

pub fn one() {
    let mut v = vec![2, 3, 4];
    if let false = v.is_empty() {
        v.push(5);
    }
}

pub fn two() {
    let mut v = vec![2, 3, 4];
    if !v.is_empty() {
        v.push(5);
    }
}

使用Rust 1.18将上述代码编译为程序集并对这两个函数进行区分显示出最小的差异,主要是围绕常量和标签名称:

--- a.asm   2017-07-06 13:53:29.000000000 -0400
+++ b.asm   2017-07-06 13:53:48.000000000 -0400
@@ -1,2 +1,2 @@
-_ZN10playground3one17hbd49bc1da7229962E:
-.Lfunc_begin0:
+_ZN10playground3two17h3228f5d5d04f0491E:
+.Lfunc_begin1:
@@ -5 +5 @@
-   .cfi_lsda 27, .Lexception0
+   .cfi_lsda 27, .Lexception1
@@ -7 +7 @@
-.Ltmp8:
+.Ltmp14:
@@ -10 +10 @@
-.Ltmp9:
+.Ltmp15:
@@ -12 +12 @@
-.Ltmp10:
+.Ltmp16:
@@ -18 +18 @@
-   je  .LBB1_8
+   je  .LBB2_8
@@ -23 +23 @@
-   movaps  .LCPI1_0(%rip), %xmm0
+   movaps  .LCPI2_0(%rip), %xmm0
@@ -25 +25 @@
-.Ltmp5:
+.Ltmp11:
@@ -28 +28 @@
-.Ltmp6:
+.Ltmp12:
@@ -36 +36 @@
-   je  .LBB1_4
+   je  .LBB2_4
@@ -40 +40 @@
-.LBB1_4:
+.LBB2_4:
@@ -44 +44 @@
-.LBB1_8:
+.LBB2_8:
@@ -46,2 +46,2 @@
-.LBB1_5:
-.Ltmp7:
+.LBB2_5:
+.Ltmp13:
@@ -51 +51 @@
-   je  .LBB1_7
+   je  .LBB2_7
@@ -56 +56 @@
-.LBB1_7:
+.LBB2_7:

对我来说,这证明他们是一样的。我仍然更喜欢布尔形式,因为它更容易理解:

let mut v = vec![2, 3, 4];
if !v.is_empty() {
    v.push(5);
}