在WWDC 2015 Session 409附近的18分钟标记.手头的讨论让我相信,通过启用整个模块优化模式,可以通过Generic Specialization优化泛型.不幸的是,我对自己没有信心的测试显示没什么用处.
我在以下两种方法之间运行了一些非常简单的测试,以查看性能是否相似:
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秒
我所期待的
启用整个模块优化后,我预计两个方法调用之间的时间相似.这让我相信我的测试是有缺陷的.
题
假设我的测试有缺陷/差.我怎样才能更好地衡量整体模块优化模式如何通过通用专业化来优化泛型?
解决方法
您的测试存在缺陷,因为它们衡量的是测试性能,而不是应用性能.测试存在于单独的可执行文件中,并且它们本身不会受益于整个模块的优化.因此,即使在程序没有的地方,您的测试也始终使用通用的非专业实现.
如果要查看可执行文件中是否启用了整个模块优化,则需要从可执行文件中测试函数. (您还需要确保您的测试使用Release版本,或者您在调试版本中启用了WMO.)
func genericIntMax(x: Int,y: Int) -> Int { return genericMax(x,y: y) }
并且在测试中使用它来代替genericMax,我获得了相同的性能. (请注意,这不是真正的整个模块优化,因为这两个函数存在于同一个文件中;但它显示了优化时应用程序代码和测试代码之间的区别.)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。