Swift 特定方法中Xcode的编译速度较慢
我使用的是Xcode 8.2.1,上一个项目的编译速度非常慢。我花了一些时间研究为什么会发生这种情况,并开始跟踪我的项目的编译时间。因此,主要问题似乎在这里: 49609.4ms编译moveIcons() 这让我有点吃惊,因为moveIcons()并不是一个真正广泛的方法:Swift 特定方法中Xcode的编译速度较慢,swift,xcode,Swift,Xcode,我使用的是Xcode 8.2.1,上一个项目的编译速度非常慢。我花了一些时间研究为什么会发生这种情况,并开始跟踪我的项目的编译时间。因此,主要问题似乎在这里: 49609.4ms编译moveIcons() 这让我有点吃惊,因为moveIcons()并不是一个真正广泛的方法: func moveIcons(_ motion : SlideMotion) { var direction : CGFloat = 1 if motion == .Out { directi
func moveIcons(_ motion : SlideMotion) {
var direction : CGFloat = 1
if motion == .Out {
direction = -1
}
for icon in 0...3 {
let currentIcon = pauseIcons[icon]
var moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0), duration: 0.2), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.18, dy: 0), duration: 0.1)])
if icon == 3 {
moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: -scene.size.width * direction, dy: 0), duration: 0.3), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.25, dy: 0), duration: 0.15)])
}
currentIcon.run(moveAction)
}
}
*PauseCons的初始化如下:(它可能包含4个对象)
现在我想可能是因为类型推断减慢了构建速度。因此,我这样做:
func moveIcons(_ motion : SlideMotion) {
var direction : CGFloat = 1
if motion == .Out {
direction = -1
}
for icon in 0...3 {
let currentIcon : SKSpriteNode = pauseIcons[icon]
var moveAction : SKAction = SKAction.sequence([SKAction.move(by: CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0), duration: 0.2), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.18, dy: 0), duration: 0.1)])
if icon == 3 {
moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: -scene.size.width * direction, dy: 0), duration: 0.3), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.25, dy: 0), duration: 0.15)])
}
currentIcon.run(moveAction)
}
}
但是,编译时间仍然是我项目的最高时间:
有人知道为什么这个特殊的方法要花这么多时间编译吗?这个表达式和相关的表达式非常复杂:
var moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0), duration: 0.2), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.18, dy: 0), duration: 0.1)])
用中间变量分解这些变量。问题不在于找出最终的类型。问题是如何解决*
和-
的所有可能性。是的,只有一种有效的可能性,但是编译器必须检查每一种可能的类型组合,以确保表达式没有歧义。特别是,它必须做大量的工作来决定0.26
是否应该是CGFloat
、Float
,或者Double
更大致的是:
for icon in 0...3 {
let currentIcon : SKSpriteNode = pauseIcons[icon]
let moveAction: SKAction
if icon == 3 {
let moveBy1 = CGVector(dx: -scene.size.width * direction, dy: 0)
let moveBy2 = CGVector(dx: scene.size.width * direction * 0.25, dy: 0)
moveAction = SKAction.sequence([
SKAction.move(by: moveBy1), duration: 0.3),
SKAction.move(by: moveBy2, duration: 0.15)])
} else {
let moveBy1 = CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0)
let moveBy2 = CGVector(dx: scene.size.width * direction * 0.18, dy: 0)
moveAction = SKAction.sequence([SKAction.move(by: moveBy1, duration: 0.2),
SKAction.move(by: moveBy2, duration: 0.1)])
}
currentIcon.run(moveAction)
}
这个表达式和相关的表达式非常复杂:
var moveAction = SKAction.sequence([SKAction.move(by: CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0), duration: 0.2), SKAction.move(by: CGVector(dx: scene.size.width * direction * 0.18, dy: 0), duration: 0.1)])
用中间变量分解这些变量。问题不在于找出最终的类型。问题是如何解决*
和-
的所有可能性。是的,只有一种有效的可能性,但是编译器必须检查每一种可能的类型组合,以确保表达式没有歧义。特别是,它必须做大量的工作来决定0.26
是否应该是CGFloat
、Float
,或者Double
更大致的是:
for icon in 0...3 {
let currentIcon : SKSpriteNode = pauseIcons[icon]
let moveAction: SKAction
if icon == 3 {
let moveBy1 = CGVector(dx: -scene.size.width * direction, dy: 0)
let moveBy2 = CGVector(dx: scene.size.width * direction * 0.25, dy: 0)
moveAction = SKAction.sequence([
SKAction.move(by: moveBy1), duration: 0.3),
SKAction.move(by: moveBy2, duration: 0.15)])
} else {
let moveBy1 = CGVector(dx: (-scene.size.width * direction * 0.26) - (scene.size.width * 0.18 * direction), dy: 0)
let moveBy2 = CGVector(dx: scene.size.width * direction * 0.18, dy: 0)
moveAction = SKAction.sequence([SKAction.move(by: moveBy1, duration: 0.2),
SKAction.move(by: moveBy2, duration: 0.1)])
}
currentIcon.run(moveAction)
}
Swift的一个众所周知的问题是,具有深度嵌套表达式的编译速度慢。(你试过最新版本的Xcode吗?)注释左值不会有什么坏处,但它对每行的其他十几个推论都没有帮助。例如,在第8行中,您正在执行8个算术运算,而您只需要执行2个运算。Swift的一个已知问题是使用深度嵌套的表达式时编译速度慢。(你试过最新版本的Xcode吗?)注释左值不会有什么坏处,但它对每行的其他十几个推论都没有帮助。例如,在第8行中,您正在执行8个算术运算,而您只需要执行2个。将尝试执行该操作并运行另一次扫描。谢谢你的建议。我会让你知道它是如何进行的。我会简化
(-scene.size.width*direction*0.26)-(scene.size.width*0.18*direction)
——如果你只合并公共因子,这可能是操作数的一半。因此,我会计算scene.size.width*direction
一次,因为它使用了很多地方。这个答案,和你的评论一起@Ssswift是一个救命稻草。我还将所有这些文本(如0.26)转换为CGFloat(0.26),并提供了很多帮助。我将尝试并运行另一次扫描。谢谢你的建议。我会让你知道它是如何进行的。我会简化(-scene.size.width*direction*0.26)-(scene.size.width*0.18*direction)
——如果你只合并公共因子,这可能是操作数的一半。因此,我会计算scene.size.width*direction
一次,因为它使用了很多地方。这个答案,和你的评论一起@Ssswift是一个救命稻草。我还将所有这些文本(如0.26)转换为CGFloat(0.26),并提供了很多帮助。