Swift Explicit与推断打字:性能

时间:2014-07-05 17:30:27

标签: performance types compiler-construction swift

我正在阅读有关Swift(http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start)的教程,并且它已预先设置为未明确设置类型,因为它更具可读性。

我并不是真的同意这一点,但这不是问题。我的问题是:在性能(编译器......)方面明确设置类型是否更有效?

例如,这样:var hello: Int = 56效率更高:var tutorialTeam = 56

3 个答案:

答案 0 :(得分:20)

使用显式类型的代码与使用类型推断的代码之间存在性能差异。编译后的输出在每种情况下都是相同的。

当你省略类型时,编译器只是推断它。

accepted answer中观察到的非常小的差异只是您通常的微观基准文物,并且不可信任!

您是否包含显式类型是一个品味问题。在某些情况下,它可能会使您的代码更具可读性。

它唯一一次对您的代码产生影响的是当您想要指定与编译器推断的类型不同的类型时。举个例子:

var num = 2

上面的代码推断numInt,因为它是用整数文字初始化的。但是,您可以强制使用'它是Double如下:

var num: Double = 2

答案 1 :(得分:3)

根据我的经验,在使用显式与推断类型时,编译速度方面会产生巨大的性能影响。我的慢速编译代码的大部分已通过显式键入变量来解决。

似乎Swift编译器在这方面仍有改进的余地。尝试对一些项目进行基准测试,你会看到很大的不同。

这是我在how to speed up slow Swift compile times上写的一篇文章,以及如何找出导致它的原因。

答案 2 :(得分:0)

类型推断不会影响给定示例中的性能。但是,我确实发现特定于Swift数组中的Type确实会显着影响性能。

例如,下面的方法会混合类型为Any的数组。

class func shuffleAny(inout array: [Any]) {
    for (var i = 0; i < array.count; i++) {
        let currentObject: Any = array[i]
        let randomIndex = Int(arc4random()) % array.count
        let randomObject: Any = array[randomIndex]

        array[i] = randomObject;
        array[randomIndex] = currentObject
    }
}

上面的函数实际上比我使这个函数采用Int数组更慢,而不是像这样

class func shuffleIntObjects(inout array: [Int]) {
    for (var i = 0; i < array.count; i++) {
        let currentObject: Int = array[i]
        let randomIndex = Int(arc4random()) % array.count
        let randomObject: Int = array[randomIndex]

        array[i] = randomObject;
        array[randomIndex] = currentObject
    }
}

使用[Any]的功能在0.537秒时为3%STDEV提供1百万个Int个对象。并且使用[Int]的函数在0.181秒时为2百万个STDEV提供1百万个Int对象。

你可以查看这个repo(https://github.com/vsco/swift-benchmarks),其中详细介绍了Swift中更多有趣的基准测试。我最喜欢的一个是Swift泛型在上面提到的测试条件下表现非常糟糕

相关问题