swift中的2D数组迭代速度(Beta 4)

时间:2014-07-25 14:37:44

标签: arrays swift iteration beta

我一直在与Swift中的速度问题作斗争,主要是使用数组。目前运行最新的'beta 4'版本。我已将代码分解到操场上以尝试显示问题

我设置了一个2D数组,迭代它,设置每个元素。

import UIKit

func getCurrentMillitime() -> NSTimeInterval {
    let date: NSDate = NSDate()
    return date.timeIntervalSince1970*1000;
}

let startTime = getCurrentMillitime()

let X = 40
let Y = 50
var distanceGrid = [[CGFloat]](count: X, repeatedValue:[CGFloat](count: Y,repeatedValue:CGFloat(0.0)))
for xi in 0..<X {
    for yi in 0..<Y {
        distanceGrid[xi][yi] = 1.1
       //println("x:\(xi) y:\(yi) d:\(distanceGrid[xi][yi])")
    }
}

let endTime = getCurrentMillitime()
let computationTime = endTime - startTime
println("Time to compute \(computationTime) ms")

运行上面的代码,你会得到:

Time to compute 2370.203125 ms

哪个肯定不对!我是个笨蛋?

4 个答案:

答案 0 :(得分:2)

有关Swift性能需要考虑的两件事:

  • 在测试期间,它非常响亮。

  • 许多Swift的性能技巧都依赖于优化器。特别是当涉及泛型时(每个数组都是通用的Array<T>),Swift在-O0使用更具表现力/调试器的实现,但在-O将其优化为更高性能的实现。 }或-Ofast。 (请注意,-Ofast也会带走边界检查和其他安全功能,因此对于生产构建来说,这不是一个好主意。)

另外,请注意您当前的示例是测量创建具有init(count:repeatedValue:的2D数组的时间和迭代它的时间。如果您要仅测量后者,则应在创建阵列后设置startTime

答案 1 :(得分:0)

在&#34;下标&#34;下的语言指南中,您将找到2D数组的2D(结构)实现。但如果超过1000个元素,则分配值的速度相当慢。

创建一个本地2D数组并将其设置为结构以便于访问要快得多。

创建具有重复值的数组并覆盖它们比将值附加到数组更快。

对于大约100k的值,结构需要~9秒,附加需要1.5秒,重写值需要0.6秒。

我有点像结构的想法,但它太慢了。 我当然希望这是一个测试版问题。

答案 2 :(得分:0)

很明显,Swift beta正在努力应对阵列。 即使使用一维数组,与objective-c相比,差异也很大。

我已经将一个objC类混合到一个swift程序中,并且两种语言都创建并更改了1,000,000个元素的数组。这就是我在MacBook上得到的东西:

Swift方法的经过时间:2.7078秒 通过objective-c方法经过的时间:0.033815秒

代码:(var nrOfElements = 1000000)

  // Swift
    let startTime = NSDate();
    var stringList = Array<String>(count: nrOfElements, repeatedValue:String())
    for i in 0..<nrOfElements {
      stringList[i] = "Some string";
    }
    let endTime = NSDate();
    println("Elapsed time by Swift method: " +
      NSString(format:"%.4f", endTime.timeIntervalSinceDate(startTime)) + " sec");

   // Objective-c
      NSDate *startTime = [NSDate date];
      NSMutableArray *stringList = [NSMutableArray arrayWithCapacity:10];
      for (int i = 0; i < nrOfElements; i++) {
        [stringList addObject:@"Some string"];
      }
      NSDate *endTime = [NSDate date];
      printf("%s\n", [[NSString stringWithFormat:@"Elapsed time by objective-c method: %f seconds", [endTime timeIntervalSinceDate:startTime]] UTF8String]);
  • 我发现Beta-3和Beta-4之间没有区别,因此有所改善 优先级列表中的数组处理不高。
  • 处理越来越大的数组,提供相应的更高处理时间。
  • 在增加更高维度元素的数量时,处理多维数组的成本更高
  • 在Swift中预先创建数组确实比'append'
  • 更快

让我们希望在最终版本中能够妥善修复。

答案 3 :(得分:0)

我同意你的观点,即使是测试版也不能像七十年代的硬件一样运行。所以我进一步深入研究了Swift阵列处理能力,我偶然发现了令人惊讶的结果。我们已经了解到,与Objective-c或其他语言(如c ++,c#,java等)相比,Swift数组性能较差。

在我以前的测试中,我测量了创建和填充一百万个元素的局部范围数组的时间。正如我们所看到的,objective-c的速度提高了约80倍。当我们比较在全局类范围中声明的数组时,它会变得更糟。那么objC似乎快了大约500倍!

但是,嘿,当我们最终用有用的数据填充这个全局声明的数组时,我们可以顺利地使用它吗?错!

我已经打印了10个大阵列元素,噩梦加深了。正如预期的那样,本地范围数组的10个元素花费了0,0004秒。但是打印我们全局声明的数组的相同元素需要1分11秒。这似乎太糟糕了,我确信Swift开发人员在我们发言时就已经开始了。