Is “&&” equal to “,”?

2023-04-26  本文已影响0人  捡书

这是个很有趣的问题,我们都知道Swift中if表达式有两种表示“且”的写法:

    @objc func testIF1(a: Bool, b: Bool) -> String {
        if a && b {
            return "1"
        }
        return "2"
    }
    
    @objc func testIF2(a: Bool, b: Bool) -> String {
        if a, b {
            return "1"
        }
        return "2"
    }

那么实际的运行情况中这两种写法有什么区别呢?
通过逆向可以看出来,相比&&的写法,使用,来判断且在汇编中少了一次赋值操作:


&& ,

再看调用链的深度,两者在逆向后的block数同为9个
&&的写法两种最大深度为7,最浅深度为5


&&

,的写法分支最大深度为6,最浅深度为4


,

可以看出,在Swift中使用,来判断且的效率相比于&&是要高一点点的。

上面的判断太简单,我们来看一下极限情况,上12个参数。

    @objc func testIF1(a1: Bool, a2: Bool, a3: Bool, a4: Bool, a5: Bool, a6: Bool, a7: Bool, a8: Bool, a9: Bool, a10: Bool, a11: Bool, a12: Bool) -> String {
        if a1 && a2 && a3 && a4 && a5 && a6 && a7 && a8 && a9 && a10 && a11 && a12 {
            return "1"
        }
        return "2"
    }
    
    @objc func testIF2(a1: Bool, a2: Bool, a3: Bool, a4: Bool, a5: Bool, a6: Bool, a7: Bool, a8: Bool, a9: Bool, a10: Bool, a11: Bool, a12: Bool) -> String {
        if a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9 , a10 , a11 , a12 {
            return "1"
        }
        return "2"
    }

通过逆向可以看出来,相比&&的写法,使用,来判断且在汇编中少了11次赋值操作:


&&
,

使用&&时,有49个block,函数size为784,函数的深度最深37,最浅25:


&&

使用,时,有39个block,函数size为568,函数的深度最深26,最浅4:


,

可以十分直观的看到,当判断变量多时,使用,来判断且,效率比&&要高很多,而且函数体更小。


size
上一篇下一篇

猜你喜欢

热点阅读