在 WWDC 2015 session 409 接近 18 分钟时。手头的讨论让我相信泛型可以通过启用整个模块优化模式通过泛型特化进行优化。不幸的是,我对自己的测试没有任何用处。
我在以下两种方法之间进行了一些非常简单的测试,以查看性能是否相似:
func genericMax<T : Comparable>(x:T, y:T) -> T {
return y > x ? y : x
}
func intMax(x:Int, y:Int) -> Int {
return y > x ? y : x
}
简单的 XCTest:
func testPerformanceExample() {
self.measureBlock {
let x: Int = Int(arc4random_uniform(9999))
let y: Int = Int(arc4random_uniform(9999))
for _ in 0...1000000 {
// let _ = genericMax(x, y: y)
let _ = intMax(x, y: y)
}
}
}
发生了什么
在没有优化的情况下,以下测试是相当不同的:
- genericMax:0.018 秒
- intMax:0.005 秒
然而,对于全模块优化,以下测试并不相似:
- genericMax:0.014 秒
- intMax:0.004 秒
我的期望
启用整个模块优化后,我预计两个方法调用之间的时间相似。这让我相信我的测试存在缺陷。
问题
假设我的测试有缺陷/很差。我如何才能更好地衡量全模块优化模式如何通过泛型特化优化泛型?
最佳答案
您的测试存在缺陷,因为它们衡量的是测试性能,而不是应用性能。测试存在于一个单独的可执行文件中,它们本身并不能从整个模块优化中获益。因此,您的测试始终使用通用的、非专门的实现,即使在您的程序不使用的地方也是如此。
如果您想查看可执行文件中是否启用了全模块优化,则需要测试可执行文件中的函数。 (您还需要确保您的测试使用发布版本,或者您在调试版本中启用了 WMO。)
将此函数添加到可执行文件中:
func genericIntMax(x: Int, y: Int) -> Int {
return genericMax(x, y: y)
}
并在测试中使用它代替 genericMax
,我获得了相同的性能。 (请注意,这并不是真正的整个模块优化,因为这两个函数位于同一个文件中;但它显示了应用代码和测试代码在优化方面的差异。)
关于swift - 如何通过整个模块优化来测试通用性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34560957/