2014-07-25 31 views
2

我一直在Swift中与速度问题作斗争,主要是与数组。目前运行最新的'beta 4'版本。我已经打破了代码到游乐场试图显示问题Swift中的二维数组迭代速度(Beta 4)

我设置一个二维数组,迭代它,设置每个元素。

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 

这肯定不可能是正确的..我是不是一个numpty!?

+0

+1使用“numpty”这个词(但肯定你不是)! – GoZoner

+0

这是奇怪的...在_beta4_我有更快的运行时间:_“计算72.72509765625毫秒的时间”_。该代码看起来在我的电脑快了30倍... – holex

回答

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和β-4之间没有区别,所以提高 阵列处理不是高优先级列表上。
  • 处理越来越大的阵列,给出更高的处理时间。
  • 处理多维数组增加更高维度的元素数量斯威夫特数组
  • 预创建确实快于“追加”

让我们希望,当是更昂贵的事情充分地将在最终版本中修复。

+0

感谢非常澄清我的发现,似乎有一个遗憾,有这样的一个基本部分一个语言滞后..测试与否,我正在努力弄清楚为什么4年左右后,阵列仍然被包裹在棉绒中! – guyvert1

+0

您的基准测试版在测试版5中不再显示为正确。当我运行上面的Swift和Objective-C代码时,我使用Swift的-O优化功能获得Swift的0.050875秒和Objective-C的0.040739秒(什么是用于Release版本)和-Os用于Objective-C(在2012 i7 Retina MBP上)。您可能需要重新运行这些测试。 –

2

两件事情要考虑有关斯威夫特的表现:

  • 这是非常空气测试期间多了。

  • 许多Swift的性能技巧都依赖于优化器。尤其是当涉及泛型时(每个数组都是通用的Array<T>),Swift在-O0处使用更具表达性/调试器友好的实现,但将其优化为更高性能的实现,即-O-Ofast。 (请注意,-Ofast也带走了边界检查和其他安全功能,所以它不是生产建立一个伟大的想法。)

此外,请注意当前的例子是测量既要创建一个二维数组与init(count:repeatedValue:时间并重复它的时间。如果您只是测量后者,则应在创建阵列后设置startTime

+0

完全理解'测试'的状态,只是想知道如果别人看到类似的... – guyvert1

0

在“下标”下的语言指南中,您会发现2D数组的二维(结构)实现。但是如果你超过1000个元素,分配值的速度会很慢。

创建本地二维数组并将其设置到结构体中以便于访问要快得多。

创建具有重复值的数组并重写它们的数组比将数组追加到数组的速度还快。

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

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

0

我同意你的观点,即使是测试版本也不能像70年代的硬件上的八十年代的软件那样表现。所以我做了一些更深入的Swift数组处理功能,我偶然发现了惊人的结果。我们已经知道,与Objective-C或其他语言(如C++,c#,java等)相比,Swift阵列性能较差。

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

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

我已经打印了10个元素的大阵列和恶梦加深。正如可以预料的那样,本地作用域数组的10个元素花费了0,0004秒。但是,打印我们全球声明阵列中相同的元素花费了1分11秒。这看起来太糟糕了,我确信Swift开发者在我们发言时就已经开始了。