首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速二维阵列迭代速度(Beta 4)

快速二维阵列迭代速度(Beta 4)
EN

Stack Overflow用户
提问于 2014-07-25 14:37:43
回答 4查看 841关注 0票数 2

我一直在与Swift中的速度问题作斗争,主要是通过数组。目前运行与最新的'beta 4‘版本。我已经把代码破译到操场上,试图展示这些问题。

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

代码语言:javascript
复制
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")

运行上面的代码,您将得到:

代码语言:javascript
复制
Time to compute 2370.203125 ms

这肯定是不对的!我是个笨蛋吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-02 08:54:43

很明显,Swift测试版正在与数组进行斗争。即使是一维阵列,与目标c相比,差异也是巨大的.

我已经将一个objC类混合到一个快速程序中,并让两种语言创建和修改一个包含1,000,000个元素的数组。这就是我在一些MacBook上看到的:

Swift方法的运行时间: 2.7078秒,目标-c方法: 0.033815秒

代码:( var nrOfElements = 1000000 )

代码语言:javascript
复制
  // 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中预先创建数组确实比“追加”更快。

让我们希望在最终版本中,事情能得到充分的修复。

票数 0
EN

Stack Overflow用户

发布于 2014-07-25 16:14:17

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

  • 在测试版的时候,它在空气中非常活跃。
  • Swift的许多性能技巧都依赖于优化器。特别是当泛型涉及到(每个数组都是泛型Array<T>)时,Swift在-O0上使用了更有表现力的/调试器友好的实现,但将其优化为-O-Ofast的高性能实现。(请注意,-Ofast还取消了边界检查和其他安全特性,因此对于生产构建来说,这不是一个好主意。)

另外,注意当前的例子是测量用init(count:repeatedValue:创建2D数组的时间和迭代它的时间。如果只测量后者,则应该在创建数组后设置startTime

票数 2
EN

Stack Overflow用户

发布于 2014-07-26 15:38:42

在“下标”下的语言指南中,您将看到2D数组的2D (struct)实现。但是,如果超过1000个元素,则赋值的速度会比较慢。

为了便于访问,创建本地2D数组并将其设置到结构中要快得多。

创建具有重复值的数组并覆盖它们也比将值追加到数组中要快。

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

我有点喜欢结构的想法,但它太慢了。我真希望这是个测试版。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24958255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档