我一直在与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这肯定是不对的!我是个笨蛋吗?
发布于 2014-08-02 08:54:43
很明显,Swift测试版正在与数组进行斗争。即使是一维阵列,与目标c相比,差异也是巨大的.
我已经将一个objC类混合到一个快速程序中,并让两种语言创建和修改一个包含1,000,000个元素的数组。这就是我在一些MacBook上看到的:
Swift方法的运行时间: 2.7078秒,目标-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]);让我们希望在最终版本中,事情能得到充分的修复。
发布于 2014-07-25 16:14:17
关于Swift的性能,有两件事需要考虑:
Array<T>)时,Swift在-O0上使用了更有表现力的/调试器友好的实现,但将其优化为-O或-Ofast的高性能实现。(请注意,-Ofast还取消了边界检查和其他安全特性,因此对于生产构建来说,这不是一个好主意。)另外,注意当前的例子是测量用init(count:repeatedValue:创建2D数组的时间和迭代它的时间。如果只测量后者,则应该在创建数组后设置startTime。
发布于 2014-07-26 15:38:42
在“下标”下的语言指南中,您将看到2D数组的2D (struct)实现。但是,如果超过1000个元素,则赋值的速度会比较慢。
为了便于访问,创建本地2D数组并将其设置到结构中要快得多。
创建具有重复值的数组并覆盖它们也比将值追加到数组中要快。
对于大约100 k的值,结构大约需要9秒,附加值需要1.5秒,覆盖重复值需要0.6秒。
我有点喜欢结构的想法,但它太慢了。我真希望这是个测试版。
https://stackoverflow.com/questions/24958255
复制相似问题