如有疑问,请查看生成的汇编代码:)
func foo(someBool : Bool) -> UInt8 {
let x = UInt8(UInt(someBool))
return x
}
用 ("-O" = "Compile with optimizations") 编译
xcrun -sdk macosx swiftc -emit-assembly -O main.swift
给予
.globl __TF4main3fooFSbVSs5UInt8
.align 4, 0x90
__TF4main3fooFSbVSs5UInt8:
.cfi_startproc
pushq %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq %rsp, %rbp
ltmp4:
.cfi_def_cfa_register %rbp
callq __TFE10FoundationSb19_bridgeToObjectiveCfSbFT_CSo8NSNumber
movq %rax, %rdi
callq __TFE10FoundationSuCfMSuFCSo8NSNumberSu
movzbl %al, %ecx
cmpq %rcx, %rax
jne LBB0_2
流行音乐%rbp
回复
函数名可以用
$ xcrun -sdk macosx swift-demangle __TFE10FoundationSb19_bridgeToObjectiveCfSbFT_CSo8NSNumber __TFE10FoundationSuCfMSuFCSo8NSNumberSu
_TFE10FoundationSb19_bridgeToObjectiveCfSbFT_CSo8NSNumber ---> ext.Foundation.Swift.Bool._bridgeToObjectiveC (Swift.Bool)() -> ObjectiveC.NSNumber
_TFE10FoundationSuCfMSuFCSo8NSNumberSu ---> ext.Foundation.Swift.UInt.init (Swift.UInt.Type)(ObjectiveC.NSNumber) -> Swift.UInt
没有采用Bool 参数的UInt 初始化程序。
所以智能编译器使用了 Swift 之间的自动转换
和 Foundation 类型并生成一些代码,例如
let x = UInt8(NSNumber(bool: someBool).unsignedLongValue)
两个函数调用可能效率不高。 (而且它没有
如果你只有import Swift,没有Foundation,则编译。)
现在您假设数据相关分支的另一种方法:
func bar(someBool : Bool) -> UInt8 {
let x = UInt8(someBool ? 1 : 0)
return x
}
汇编代码是
.globl __TF4main3barFSbVSs5UInt8
.align 4, 0x90
__TF4main3barFSbVSs5UInt8:
pushq %rbp
movq %rsp, %rbp
andb $1, %dil
移动 %dil, %al
流行音乐%rbp
回复
没有分支,只是与0x01 的“AND”操作!
因此,我认为没有理由不使用这种“直接”转换。
然后,您可以使用 Instruments 进行分析以检查它是否是瓶颈
你的应用程序。