我一直在与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
哪个肯定不对!我是个笨蛋?
答案 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]);
让我们希望在最终版本中能够妥善修复。
答案 3 :(得分:0)
我同意你的观点,即使是测试版也不能像七十年代的硬件一样运行。所以我进一步深入研究了Swift阵列处理能力,我偶然发现了令人惊讶的结果。我们已经了解到,与Objective-c或其他语言(如c ++,c#,java等)相比,Swift数组性能较差。
在我以前的测试中,我测量了创建和填充一百万个元素的局部范围数组的时间。正如我们所看到的,objective-c的速度提高了约80倍。当我们比较在全局类范围中声明的数组时,它会变得更糟。那么objC似乎快了大约500倍!
但是,嘿,当我们最终用有用的数据填充这个全局声明的数组时,我们可以顺利地使用它吗?错!
我已经打印了10个大阵列元素,噩梦加深了。正如预期的那样,本地范围数组的10个元素花费了0,0004秒。但是打印我们全局声明的数组的相同元素需要1分11秒。这似乎太糟糕了,我确信Swift开发人员在我们发言时就已经开始了。