如何通过整个模块优化来测试通用性能
How to test generic performance with whole module optimization
WWDC 2015 第 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
}
简单的 XC 测试:
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 秒
如我所料
启用整个模块优化后,我预计两个方法调用之间的时间相似。这让我相信我的测试是有缺陷的。
问题
假设我的测试有缺陷/很差。我怎样才能更好地衡量整个模块优化模式如何通过泛型专业化优化泛型?
您的测试存在缺陷,因为它们衡量的是测试性能,而不是应用性能。测试存在于单独的可执行文件中,并且它们本身不会受益于 whole-module 优化。因此,您的测试始终使用通用的 non-specialized 实现,即使在您的程序不使用的地方也是如此。
如果您想看到 whole-module 优化在您的可执行文件中启用,您需要测试可执行文件中的函数。 (您还需要确保您的测试使用发布版本,或者您在调试版本中启用了 WMO。)
将此函数添加到可执行文件中:
func genericIntMax(x: Int, y: Int) -> Int {
return genericMax(x, y: y)
}
并在测试中使用它代替 genericMax
,我获得了相同的性能。 (请注意,这并不是真正的整个模块优化,因为这两个函数位于同一个文件中;但它显示了应用代码和测试代码在优化方面的差异。)
WWDC 2015 第 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
}
简单的 XC 测试:
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 秒
如我所料
启用整个模块优化后,我预计两个方法调用之间的时间相似。这让我相信我的测试是有缺陷的。
问题
假设我的测试有缺陷/很差。我怎样才能更好地衡量整个模块优化模式如何通过泛型专业化优化泛型?
您的测试存在缺陷,因为它们衡量的是测试性能,而不是应用性能。测试存在于单独的可执行文件中,并且它们本身不会受益于 whole-module 优化。因此,您的测试始终使用通用的 non-specialized 实现,即使在您的程序不使用的地方也是如此。
如果您想看到 whole-module 优化在您的可执行文件中启用,您需要测试可执行文件中的函数。 (您还需要确保您的测试使用发布版本,或者您在调试版本中启用了 WMO。)
将此函数添加到可执行文件中:
func genericIntMax(x: Int, y: Int) -> Int {
return genericMax(x, y: y)
}
并在测试中使用它代替 genericMax
,我获得了相同的性能。 (请注意,这并不是真正的整个模块优化,因为这两个函数位于同一个文件中;但它显示了应用代码和测试代码在优化方面的差异。)