相关疑难解决方法(0)

Swift Beta性能:排序数组

我在Swift Beta中实现了一个算法,并注意到性能非常差.在深入挖掘之后,我意识到其中一个瓶颈就像排序数组一样简单.相关部分在这里:

let n = 1000000
var x =  [Int](repeating: 0, count: n)
for i in 0..<n {
    x[i] = random()
}
// start clock here
let y = sort(x)
// stop clock here
Run Code Online (Sandbox Code Playgroud)

在C++中,类似的操作在我的计算机上需要0.06秒.

在Python中,它需要0.6秒(没有技巧,只有y =排序(x)表示整数列表).

在Swift中,如果我使用以下命令编译它需要6秒:

xcrun swift -O3 -sdk `xcrun --show-sdk-path --sdk macosx`
Run Code Online (Sandbox Code Playgroud)

如果我使用以下命令编译它需要多达88秒:

xcrun swift -O0 -sdk `xcrun --show-sdk-path --sdk macosx`
Run Code Online (Sandbox Code Playgroud)

Xcode中使用"Release"与"Debug"构建的计时相似.

这有什么不对?与C++相比,我可以理解一些性能损失,但与纯Python相比,速度没有降低10倍.


编辑:天气注意到,改变-O3以-Ofast使这个代码的运行几乎一样快如C++版本!但是,-Ofast更改了语言的语义 - 在我的测试中,它禁用了对整数溢出和数组索引溢出的检查.例如,使用-Ofast以下Swift代码以静默方式运行而不会崩溃(并打印出一些垃圾):

let …
Run Code Online (Sandbox Code Playgroud)

sorting performance compiler-optimization swift xcode6

914
推荐指数
9
解决办法
11万
查看次数

非常慢的Objc迁移到快速代码

在我编写的应用程序中,我有一个从Core-Data解析大量数据并将其显示到图形的过程.在进行此处理时,我最终还是将数据写入CSV文件.我创建了一个名为CSVLine的单独类,它可以帮助创建CSV文件.
对于140k记录的测试用例,我的Objective-C代码需要大约12秒才能运行.将类"迁移"到swift后现在需要280-360秒才能运行.显然我做了一些可怕的事情.

使用仪器我能够识别"慢"方法,我想知道我是否在SWIFT中做了一些明确的事情来解决问题.

Objc

- (void)newLine {
//    NSLog(@"Appending %@", self.csvString);

    [outData appendData:[self csvData] ];
    [self clear];
}

- (void)clear {

    // Erase every single value

    for (NSUInteger i = 0; i < [values count]; i ++) {
        values[i] = @"";
    }
}
Run Code Online (Sandbox Code Playgroud)

迅速

func newLine() {
    outData.appendData(csvData())
    clear()
}


// Clear out the Array
func clear() {
    for (var i = 0; i < values.count; i++) {
        values[i] = ""
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用各种类型的数据,这些数据都写入单个CSV文件,因此有许多空白行.为了适应这个,我设计了这个类,使它有一个数组keys和一个数组values.该 …

objective-c ios swift

3
推荐指数
1
解决办法
310
查看次数