swift - 如何通过整个模块优化来测试通用性能

标签 swift generics optimization compiler-optimization

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

相关文章:

delphi - 如何使用 RTTI 检查或更改存在哪些集合元素?

java - 如何在java中处理通用列表List<MyClass>以特定方式获取结果集

ios - Swift - 向 touchesBegan 中的操作添加计时器

ios - 如何使用 GADBannerViewDelegate 对 adViewDidReceiveAd 执行操作

java - 为什么在 put 方法中使用泛型声明 "<? super ArrayList> does not accept value "new Object()"的 HashMap?

java - 如果重复相同的代码,为什么 Java 会更快?

c++ - 将 float 类型更改为 short 但具有与 float 类型变量相同的行为

ios - 如何在ScrollView中为ImageView设置自动布局约束?

swift - 有没有办法使用 NSSharingService 包含诸如 "BCC"和 "CC"之类的字段?

java - 在获取对象 (java) 时减少 Google App Engine 中的 datastore_v3.Next 调用,可能吗?