gpt4 book ai didi

swift - 在 Swift 中,计算 2 个值的总和两次或计算一次并将结果存储在变量中是否更快?

转载 作者:行者123 更新时间:2023-12-04 22:09:36 25 4
gpt4 key购买 nike

我正在创建一个性能高的应用程序,并想知道哪种编写相同代码的方式在运行时运行得更快。

选项1:

let a = 1 + 2
self.doSomething(with: a)
self.doSomethingElse(with: a)

选项 2:
self.doSomething(with: 1 + 2)
self.doSomethingElse(with: 1 + 2)

如果任何选项更快,那么结构是否也是如此?例如
let a = CGPoint(x: 1, y: 1)
self.doSomething(with: a)
self.doSomethingElse(with: a)

或者
self.doSomething(with: CGPoint(x: 1, y: 1))
self.doSomethingElse(with: CGPoint(x: 1, y: 1))

编辑:添加了真实世界的场景
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {
return
}

let currentPoint = touch.location(in: view)
let lastPoint = touch.previousLocation(in: view)


//////////

let newPoint1 = CGPoint(x: lastPoint.x - currentPoint.x, y: lastPoint.y - currentPoint.y)
let newPoint2 = CGPoint(x: lastPoint.y - currentPoint.y, y: lastPoint.x - currentPoint.x)

// OR

let newX = lastPoint.x - currentPoint.x
let newY = lastPoint.y - currentPoint.y
let newPoint11 = CGPoint(x: newX, y: newY)
let newPoint22 = CGPoint(x: newY, y: newX)

///////

print([newPoint1, newPoint2])
print([newPoint11, newPoint22])
}

最佳答案

使用 let 计算一次值。这告诉 Swift 编译器同一个值被使用了两次,并允许 Swift 编译器/优化器生成更紧凑的代码。如果您知道该值是相同的,请与编译器共享该信息,并且不要让优化器自己计算出来(因为它可能无法计算)。

在您使用 1 + 2 的示例中,由于 Constant Folding ,这肯定会在两个实例中生成相同的代码。编译器会在编译时执行 1 + 2,生成的代码只会将 3 传递给每个函数调用。

在您的第二个示例中,Swift 编译器可能无法识别您生成了相同 struct 的两个版本,并且它可能会发出生成 struct 两次的代码。通过将该结构分配给一个常量 a ,Swift 知道它可以将相同的 struct 传递给两个函数并避免创建它两次。

一般规则: 为编译器提供更多信息使其能够进行更好的优化。

附加好处: 使用 let 使您的代码更具可读性和更容易修改。

在您的 现实世界场景中 :

let newPoint1 = CGPoint(x: lastPoint.x - currentPoint.x, y: lastPoint.y - currentPoint.y)
let newPoint2 = CGPoint(x: lastPoint.y - currentPoint.y, y: lastPoint.x - currentPoint.x)

// OR

let newX = lastPoint.x - currentPoint.x
let newY = lastPoint.y - currentPoint.y
let newPoint11 = CGPoint(x: newX, y: newY)
let newPoint22 = CGPoint(x: newY, y: newX)

同样,编译器可能会生成相同的代码,因为有一种称为 Common Subexpression Elimination 的技术,编译器会检测并消除冗余表达式。但是为什么要依赖这个呢?您知道这些值代表 newXnewY ,因此通过首先将它们计算为常量,您 1) 让编译器知道计算此表达式一次,2) 向您自己和您的读者记录代码的意图。

除了向编译器/优化器提供额外提示外,第二个示例更清晰且更易于修改。总的来说,它是更好的代码。

关于swift - 在 Swift 中,计算 2 个值的总和两次或计算一次并将结果存储在变量中是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57938286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com