识别慢速代码以优化构建时间



我正在使用这些编译 Swift 标志来识别减慢编译时间的代码:

-Xfrontend -warn-long-function-bodies=100
-Xfrontend -warn-long-expression-type-checking=100

然后在构建之后,我得到这样的warnings

Instance method 'startFadePositionTitle()' took 2702ms to type-check (limit: 500ms)

对于代码的这一部分:

func startFadePositionTitle() -> CGFloat {
let value: CGFloat = ((backgroundImage.frame.height/2 - contentTitle.frame.height/2) - navbarView.frame.height)/2
return value
}

有人可以解释我这种方法有什么问题,我可以改进什么吗?

你应该把它分解成更小的块,然后 Swift 可以更容易地进行类型检查。此外,你说的越多,斯威夫特就越少思考。因此,您可以帮助编译器并告诉它您已经知道的任何内容:

func beginFadePositionTitle() -> CGFloat {
let n: CGFloat = 2
let a: CGFloat = self.backgroundImage.frame.height/n
let b: CGFloat = self.contentTitle.frame.height/n
let ab: CGFloat = a - b
let c: CGFloat = self.navbarView.frame.height
let abc: CGFloat = ab - c
return abc/n
}

实例方法"beginFadePositionTitle(("需要1ms进行类型检查(限制:1ms(

这是当你把所有东西都告诉编译器时的结果。看到区别了吗?

我建议试试这个

func startFadePositionTitle() -> CGFloat {
return ((backgroundImage.frame.height - contentTitle.frame.height)/2.0 - 
navbarView.frame.height)/2.0
}

使用我的 Xcode 11.2/Catalina(测试假设所有这些frame都是CGRects(,这些编译器标志没有这样的警告。在极端情况下,可以在相应的位置使用CGFloat(2.0),但我认为这是多余的。

每次调用此方法时,您都在计算startFadePositionTitle

您可以指定一次和之后,然后可以自由使用。

let value: CGFloat = ((backgroundImage.frame.height/2 - contentTitle.frame.height/2) - navbarView.frame.height)/2

在视图中使用它DidLoad方法

并像这样优化您的代码

func startFadePositionTitle() -> CGFloat {
return value
}

浮点除法和平方根的计算时间比加法和乘法要长得多。后两者是直接计算的,而前者通常使用迭代算法计算。最常见的方法是使用无除法牛顿-拉夫森迭代来获得分母(除法(或倒数平方根的倒数的近似值,然后乘以分子(除法(或输入参数(平方根(。

源: 为什么浮点除法很慢?

所以我把它变成了一个部门:

((x - y)/2 - z)/2 = (x-y-2z)/4

即你可以写这样的东西

(backgroundImage.frame.height - contentTitle.frame.height - 2.0*navbarView.frame.height)/4.0

所以对功能的微小变化将是这样的

func startFadePositionTitle() -> CGFloat {
return (backgroundImage.frame.height - contentTitle.frame.height - 2.0*navbarView.frame.height)/4.0
}

最新更新