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