我在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) 在我编写的应用程序中,我有一个从Core-Data解析大量数据并将其显示到图形的过程.在进行此处理时,我最终还是将数据写入CSV文件.我创建了一个名为CSVLine的单独类,它可以帮助创建CSV文件.
对于140k记录的测试用例,我的Objective-C代码需要大约12秒才能运行.将类"迁移"到swift后现在需要280-360秒才能运行.显然我做了一些可怕的事情.
使用仪器我能够识别"慢"方法,我想知道我是否在SWIFT中做了一些明确的事情来解决问题.
- (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.该 …