【问题标题】:How to test generic performance with whole module optimization如何通过整个模块优化测试通用性能
【发布时间】:2016-04-06 06:48:09
【问题描述】:

在 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 秒

我的预期

启用整个模块优化后,我预计两个方法调用之间的时间相似。这让我相信我的测试有缺陷。

问题

假设我的测试有缺陷/很差。如何更好地衡量整体模块优化模式如何通过泛型专业化优化泛型?

【问题讨论】:

    标签: swift generics optimization compiler-optimization


    【解决方案1】:

    您的测试存在缺陷,因为它们衡量的是测试性能,而不是应用性能。测试存在于一个单独的可执行文件中,它们本身并不能从整个模块优化中受益。因此,即使在您的程序不使用的地方,您的测试也总是使用通用的、非专业化的实现。

    如果你想看到你的可执行文件中启用了整个模块优化,你需要从你的可执行文件中测试一个函数。 (您还需要确保您的测试使用 Release 版本,或者您在调试版本中启用了 WMO。)

    将此函数添加到可执行文件中:

    func genericIntMax(x: Int, y: Int) -> Int {
        return genericMax(x, y: y)
    }
    

    并在测试中使用它代替 genericMax 在测试中,我得到了相同的性能。 (请注意,这并不是真正的整个模块优化,因为这两个函数位于同一个文件中;但它显示了在优化方面应用代码和测试代码之间的区别。)

    【讨论】:

    • 工作得很好,谢谢。我应该假设测试存在于单独的可执行文件中,这会影响测试。
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2018-06-25
    • 2012-09-26
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多