分配vs如果不等于那么分配... Swift是我最关心的语言

时间:2016-07-07 19:30:44

标签: swift performance if-statement variable-assignment

我有一些代码会经常运行。就性能而言,以下与声明之间是否有任何区别,如果是,哪一个更快?

#import <RLMRealm.h>

VS

num = 4

我理解差异可能很小,但我偶尔也会想到这个问题。另外,我会对与此密切相关的问题感兴趣,这些问题可能会使用if num != 4 { num = 4 } Bool而不是String

3 个答案:

答案 0 :(得分:8)

第一个肯定是更快,因为处理器必须做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时)。

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

答案 1 :(得分:3)

我读“num = 4”的速度更快。大约快三倍。这就是我关心的。你正在尝试微观优化非常可疑的价值,所以如果我看到有人写这种代码,我真的很担心。

答案 2 :(得分:0)

我相信这次检查

if num != 4 { ... }

如果比作业快

num = 4

场景#1

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

if num != 4 {
    num = 4
}

场景#2

另一方面,如果num的大部分时间与4不同,您可以删除支票,并将juts与分配相结合

num = 4