If statement 对于布尔值,“if let”和“if”之间是否存在性能差异?

If statement 对于布尔值,“if let”和“if”之间是否存在性能差异?,if-statement,rust,If Statement,Rust,例如: let mut v = vec![2, 3, 4]; if let false = v.is_empty() { v.push(5); } vs: 我的直觉是,这无关紧要。对于任何性能问题,您都需要对其进行分析。除此之外的任何事情本质上都是猜测 但是,作为第一级猜测,您可以查看生成的部件: #![crate_type="lib"] pub fn one() { let mut v = vec![2, 3, 4]; if let false = v.is_emp

例如:

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


我的直觉是,这无关紧要。

对于任何性能问题,您都需要对其进行分析。除此之外的任何事情本质上都是猜测

但是,作为第一级猜测,您可以查看生成的部件:

#![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 @@
-日本脑炎
+乙脑B 2_8
@@ -23 +23 @@
-movaps.LCPI1_0(%rip),%xmm0
+movaps.LCPI2_0(%rip),%xmm0
@@ -25 +25 @@
-.Ltmp5:
+.Ltmp11:
@@ -28 +28 @@
-.Ltmp6:
+.Ltmp12:
@@ -36 +36 @@
-日本脑炎
+日本脑炎
@@ -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.LBB2_7
@@ -56 +56 @@
-.LBB1_7:
+.LBB2_7:
对我来说,这足以证明它们是一样的。我仍然更喜欢布尔形式,因为它更容易理解:

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

高度相关,如果不是重复:为什么不
如果v.is_empty()==false{}
?它是明确的,没有无用的
let
。我理解OP.
不是真正可读的:当你用眼睛快速扫描代码时,你可以很容易地跳过它。我宁愿选择
而不是
关键字。@Boiethios:我同意,我总是发现
在这个位置很不确定,因为它很容易错过。我的意思是,
之间的区别!v
lv
/
iv
不太引人注目。@MatthieuM。不幸的是,由于向后兼容,团队可能永远不会考虑这样的突破性改变。
let mut v = vec![2, 3, 4];
if !v.is_empty() {
    v.push(5);
}