美文网首页
Is “&&” equal to “,”?

Is “&&” equal to “,”?

作者: 捡书 | 来源:发表于2023-04-26 21:03 被阅读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

    相关文章

      网友评论

          本文标题:Is “&&” equal to “,”?

          本文链接:https://www.haomeiwen.com/subject/lszvjdtx.html