【问题标题】:Assignment vs if not equal to then assign... Swift being the language I care most about赋值与如果不等于则赋值... Swift 是我最关心的语言
【发布时间】:2016-11-10 06:22:36
【问题描述】:

我有一些会经常运行的代码。就性能而言,以下与陈述之间有什么区别,如果有,哪个更快?

num = 4

if num != 4 {
    num = 4
}

我知道差异可能很小,但我有时会想到这个问题。我也对可能使用BoolString 而不是Int 的密切相关的问题感兴趣。

【问题讨论】:

    标签: swift performance if-statement variable-assignment


    【解决方案1】:

    第一个肯定更快,因为处理器必须执行 1 条指令,这需要 1 个时钟周期。在第二个中至少有 1 条或更多指令(比较和可选分配)。

    假设我们有这个代码:

    var x = 0
    x = 4
    

    这里是程序集的重要行 (swiftc -emit-assembly):

        movq    $0, __Tv4test3numSi(%rip)  // Assigns 0 to the variable
        movq    $4, __Tv4test3numSi(%rip)  // Assigns 4 to the variable
    

    如您所见,需要一条指令

    使用此代码:

    var x = 0
    if x != 4 {
        x = 4
    }
    

    组装:

        movq    $0, __Tv4test3numSi(%rip) // Assign 0 to the variable
        cmpq    $4, __Tv4test3numSi(%rip) // Compare variable with 4
        je  LBB0_4                        // If comparison was equal, jump to LBB0_4
        movq    $4, __Tv4test3numSi(%rip) // Otherwise set variable to 4
    LBB0_4:
        xorl    %eax, %eax                // Zeroes the eax register (standard for every label)
    

    如您所见,第二个使用 3 条指令(当已经等于 4 时)或 4 条指令(当不等于 4 时)。

    我从一开始就很清楚,但组装很好地证明了第二个不能更快。

    【讨论】:

    • 感谢大会!大多数情况下高级对象也会出现这种情况吗?我知道这个问题很难从整体上回答,但我通常可以回答。
    • @Sethmr 是的,每个对象都只是一个指针,它只是一个数字。当然,如果结构/类有自己的平等实现,它会更慢。基本上每个分配都只是 1 次操作,这是处理器做任何事情的最小数量,它不能比这更快
    • 我在学校被教导说,任何处理内存的东西都会比不处理内存的东西自动慢,但我猜我使用的所有变量都已经存储在缓存中了?
    • @Sethmr 分配对象时,仅分配指针。如果你有一个大结构,是的,内存会被复制,但除非你的结构异常大,否则我认为复制仍然更快。您可以对此进行更多试验,在使用对象或大型结构时查看程序集以了解更多信息
    • 我相信您已经尽我所能回答了我的问题。感谢您的宝贵时间!
    【解决方案2】:

    读“num = 4”对我来说更快。大约快三倍。这就是我关心的。您正在尝试进行价值非常可疑的微优化,所以如果我看到有人编写这种代码,我会非常担心。

    【讨论】:

      【解决方案3】:

      我相信这张支票

      if num != 4 { ... }
      

      如果比作业快

      num = 4
      

      场景 #1

      因此,如果大多数情况下 num 等于4 您应该跳过无用的分配并使用此代码

      if num != 4 {
          num = 4
      }
      

      场景 #2

      另一方面,如果大多数情况下num4 不同,您可以取消勾选,然后继续分配

      num = 4
      

      【讨论】:

        猜你喜欢
        • 2012-05-29
        • 2016-03-19
        • 1970-01-01
        • 2011-11-12
        • 2019-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多