加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 在Swift中,为什么“让_ = this”比“this!= nil”更快?

发布时间:2020-12-14 19:46:37 所属栏目:百科 来源:网络整理
导读:所以我的问题是为什么让_ =这比这快!= nil? 例: 这是: let this : Bool? = true //let start = DispatchTime.now()for _ in 0...100000000 { guard this != nil else { continue }}let end = DispatchTime.now()let nanoTime = end.uptimeNanoseconds -
所以我的问题是为什么让_ =这比这快!= nil?

例:

这是:

let this : Bool? = true //

let start = DispatchTime.now()
for _ in 0...100000000  {
    guard this != nil else { continue }
}
let end = DispatchTime.now()

let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
let timeInterval = Double(nanoTime)
print("Time (timeInterval)") 

         // Time 5426559135.0
         // Time 5428084767.0
         // Time 5327325459.0

慢于:

let this : Bool? = true //

let start = DispatchTime.now()
for _ in 0...100000000  {
    guard let _ = this else { continue }
}
let end = DispatchTime.now()

let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
let timeInterval = Double(nanoTime)
print("Time (timeInterval)")

          // Time 257045414.0
          // Time 261933863.0
          // Time 263465919.0

解决方法

在 Jonathan的 response之后,我检查了实际的反汇编指令.
结果如下:
对于代码:

let this : Bool? = nil
this != nil

我们得到:

0x100001290 <+0>:  pushq  %rbp
    0x100001291 <+1>:  movq   %rsp,%rbp
    0x100001294 <+4>:  subq   $0x30,%rsp
    0x100001298 <+8>:  leaq   0x2c7259(%rip),%rdx      ; type metadata for Swift.Bool
    0x10000129f <+15>: leaq   0x2b66ca(%rip),%rcx      ; protocol witness table for Swift.Bool : Swift.Equatable in Swift
    0x1000012a6 <+22>: leaq   -0x18(%rbp),%rax
    0x1000012aa <+26>: leaq   -0x8(%rbp),%r8
    0x1000012ae <+30>: movb   $0x2,0x2f940b(%rip)
    0x1000012b5 <+37>: movb   0x2f9404(%rip),%r9b      ; test2.this : Swift.Optional<Swift.Bool>
    0x1000012bc <+44>: movb   %r9b,-0x8(%rbp)
    0x1000012c0 <+48>: movb   $0x2,-0x10(%rbp)
    0x1000012c4 <+52>: movb   -0x10(%rbp),%r9b
    0x1000012c8 <+56>: movb   %r9b,-0x18(%rbp)
    0x1000012cc <+60>: movl   %edi,-0x1c(%rbp)
    0x1000012cf <+63>: movq   %r8,%rdi
    0x1000012d2 <+66>: movq   %rsi,-0x28(%rbp)
    0x1000012d6 <+70>: movq   %rax,%rsi
    0x1000012d9 <+73>: callq  0x10004df10               ; Swift.!= infix <A where A: Swift.Equatable> (Swift.Optional<A>,Swift.Optional<A>) -> Swift.Bool
    0x1000012de <+78>: xorl   %r10d,%r10d
    0x1000012e1 <+81>: movb   %al,-0x29(%rbp)
    0x1000012e4 <+84>: movl   %r10d,%eax
    0x1000012e7 <+87>: addq   $0x30,%rsp
    0x1000012eb <+91>: popq   %rbp
    0x1000012ec <+92>: retq

并为:

let this : Bool? = nil
let _ = this

有:

0x1000012d0 <+0>:  pushq  %rbp
    0x1000012d1 <+1>:  movq   %rsp,%rbp
    0x1000012d4 <+4>:  xorl   %eax,%eax
    0x1000012d6 <+6>:  movb   $0x2,0x2f93e3(%rip)
    0x1000012dd <+13>: movl   %edi,-0x4(%rbp)
    0x1000012e0 <+16>: movq   %rsi,-0x10(%rbp)
    0x1000012e4 <+20>: popq   %rbp
    0x1000012e5 <+21>: retq

另外,谢谢Code Different指向优化级别.

将值从[-Onone]更改为[-O -whole-module-optimization]将导致生成的asm按以下方式更改:

let this : Bool? = nil
let _ = this

具有

0x100001490 <+0>:  pushq  %rbp
    0x100001491 <+1>:  movq   %rsp,%rbp
    0x100001494 <+4>:  movb   $0x2,0x3d9595(%rip)      ; gCRAnnotations + 63
    0x10000149b <+11>: xorl   %eax,%eax
    0x10000149d <+13>: popq   %rbp
    0x10000149e <+14>: retq

let this : Bool? = nil
this != nil

0x100001490 <+0>:  pushq  %rbp
    0x100001491 <+1>:  movq   %rsp,%eax
    0x10000149d <+13>: popq   %rbp
    0x10000149e <+14>: retq

所以结果指令实际上是相同的,执行它们的时间应该非常接近.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读