Swift中可选的成本

Khu*_*zad 1 performance optional swift

我想知道是否存在与Swift中的选项相关的任何性能成本,例如,如果我们必须重复使用选项.考虑以下两个代码片段
第一种方法

    var f: Foo?
    // foo returns an optional
    if let anotherF = foo() {
        f = anotherF
    }
    else {
        f = Foo()
    }
    f?.doSomething()
    f?.doSomethingElse()
    f?.doAnotherThing()
    // and so on
Run Code Online (Sandbox Code Playgroud)

第二种方法

    var f = Foo()
    if let anotherF = foo() {
        f = anotherF
    }
    f.doSomething()
    f.doAnotherThing()
    f.doAnotherThing()
    // and so on
Run Code Online (Sandbox Code Playgroud)

与第一种方法相比,第二种方法是否有任何性能优势

Cha*_*tka 5

这个:

func bar(foo: Foo) {
    foo.doSomething()
}
Run Code Online (Sandbox Code Playgroud)

生成以下程序集:

bar`bar(foo:):
0x100001370 <+0>:  pushq  %rbp
0x100001371 <+1>:  movq   %rsp, %rbp
0x100001374 <+4>:  pushq  %r13
0x100001376 <+6>:  subq   $0x18, %rsp
0x10000137a <+10>: movq   %rdi, -0x10(%rbp)
0x10000137e <+14>: movq   (%rdi), %rax
0x100001381 <+17>: movq   0x50(%rax), %rax
0x100001385 <+21>: movq   %rdi, %r13
0x100001388 <+24>: movq   %rdi, -0x18(%rbp)
0x10000138c <+28>: callq  *%rax
0x10000138e <+30>: movq   -0x18(%rbp), %rdi
0x100001392 <+34>: callq  0x1000013f0               ; swift_rt_swift_release
0x100001397 <+39>: addq   $0x18, %rsp
0x10000139b <+43>: popq   %r13
0x10000139d <+45>: popq   %rbp
0x10000139e <+46>: retq  
Run Code Online (Sandbox Code Playgroud)

不过这个:

func bar(foo: Foo?) {
    foo?.doSomething()
}
Run Code Online (Sandbox Code Playgroud)

生成以下内容:

bar`bar(foo:):
0x100001340 <+0>:  pushq  %rbp
0x100001341 <+1>:  movq   %rsp, %rbp
0x100001344 <+4>:  pushq  %r13
0x100001346 <+6>:  subq   $0x18, %rsp
0x10000134a <+10>: movq   %rdi, -0x10(%rbp)
0x10000134e <+14>: movq   %rdi, -0x18(%rbp)
0x100001352 <+18>: callq  0x1000013f0               ; swift_rt_swift_retain
0x100001357 <+23>: movq   -0x18(%rbp), %rdi
0x10000135b <+27>: cmpq   $0x0, %rdi
0x10000135f <+31>: sete   %al
0x100001362 <+34>: xorb   $-0x1, %al
0x100001364 <+36>: testb  $0x1, %al
0x100001366 <+38>: jne    0x100001373               ; <+51> at main.swift:16
0x100001368 <+40>: movq   -0x18(%rbp), %rdi
0x10000136c <+44>: callq  0x100001400               ; swift_rt_swift_release
0x100001371 <+49>: jmp    0x10000139a               ; <+90> at main.swift:16
0x100001373 <+51>: movq   -0x18(%rbp), %rax
0x100001377 <+55>: movq   (%rax), %rcx
0x10000137a <+58>: movq   %rax, %r13
0x10000137d <+61>: callq  *0x50(%rcx)
0x100001380 <+64>: movq   -0x18(%rbp), %rdi
0x100001384 <+68>: callq  0x100001400               ; swift_rt_swift_release
0x100001389 <+73>: movq   -0x18(%rbp), %rdi
0x10000138d <+77>: callq  0x100001400               ; swift_rt_swift_release
0x100001392 <+82>: addq   $0x18, %rsp
0x100001396 <+86>: popq   %r13
0x100001398 <+88>: popq   %rbp
0x100001399 <+89>: retq   
0x10000139a <+90>: jmp    0x100001389               ; <+73> at main.swift:17 
Run Code Online (Sandbox Code Playgroud)

如您所见,可选版本会生成更多指令,因此似乎会涉及一些开销.不过,我的期望是它会很小.