Ios 非常缓慢地将Objc迁移到swift代码
在我编写的应用程序中,我有一个从核心数据解析大量数据并将其显示为图形的过程。在进行此处理时,我还将数据写入CSV文件。我创建了一个名为CSVLine的单独类,它帮助创建CSV文件。Ios 非常缓慢地将Objc迁移到swift代码,ios,objective-c,swift,Ios,Objective C,Swift,在我编写的应用程序中,我有一个从核心数据解析大量数据并将其显示为图形的过程。在进行此处理时,我还将数据写入CSV文件。我创建了一个名为CSVLine的单独类,它帮助创建CSV文件。 对于我记录的140k测试用例,我的Objective-C代码运行大约需要12秒。在将类“迁移”到swift之后,现在运行大约需要280-360秒。显然我做了一些可怕的事 使用仪器,我能够识别出“慢”的方法,我想知道我是否在SWIFT中做了一些明确的事情,导致了这个问题 Objc 我的问题似乎是由调试生成引起的。在调试
对于我记录的140k测试用例,我的Objective-C代码运行大约需要12秒。在将类“迁移”到swift之后,现在运行大约需要280-360秒。显然我做了一些可怕的事 使用仪器,我能够识别出“慢”的方法,我想知道我是否在SWIFT中做了一些明确的事情,导致了这个问题 Objc
我的问题似乎是由调试生成引起的。在调试构建中没有优化。一旦你进行了一次构建,优化就开始了,运行速度会快得多
与此处发布的答案类似:确保Swift在构建设置中的优化级别不为-Onone。根据我的经验,它比-O慢几个数量级(-O也是“release”的默认值,因此您也可以简单地为release构建,正如前面所建议的那样。)至于“调零”数组,使用重复值简单地重新初始化数组可能更快(尽管我不知道):
values = [String](count: values.count, repeatedValue: "")
或者,如果您知道在进行过程中会添加新值,并且不一定要使用索引,则可以调用:
values.removeAll(keepCapacity: true)
并使用values.append()而不是在索引处添加新值。您确定在这两种情况下都使用发布版本进行测试吗?使用Swift,调试版本和发布版本之间的性能差异可能很大。我想我刚刚发现。。。因为现在它运行良好-这是优化,不是吗…谢谢!我要把这两个都试一下。构建设置是罪魁祸首。在我的测试用例中,将16737732字节的数组归零从2.37秒(无优化)变为0.0165秒(优化)。快了143倍!顺便说一句,在同一台机器上,C的
memset
只花了0.00827秒——这是另一个2倍的加速。
@objc class CSVLineSwift : NSObject {
// Define Arrays
var keys: [String] = [String]()
var values: [String] = [String]()
var outData : NSMutableData = NSMutableData()
override init() {
}
// Singelton Operator - Thread Safe :: http://code.martinrue.com/posts/the-singleton-pattern-in-swift
class var instance : CSVLineSwift {
// Computed Property
struct Static {
static var instance : CSVLineSwift?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = CSVLineSwift();
}
return Static.instance!
}
// Erase existing Data
func newFile() {
outData = NSMutableData();
outData.appendData(headerData())
}
func csvString() -> String {
return ",".join(values)
}
func csvData() -> NSData {
let string = csvString()
let data = string.dataUsingEncoding(NSUTF8StringEncoding)
return data!
}
func addField(field : String) {
keys.append(field)
values.append("")
}
func setValueForKey(value:String, key:String) {
if let index = find(keys, key) {
values[index] = value
} else {
print( "ERROR -- There was no key: \(key) in the header Array")
}
}
func headerString() -> String {
return ",".join(keys)
}
func headerData() -> NSData {
return headerString().dataUsingEncoding(NSUTF8StringEncoding)!
}
func newLine() {
outData.appendData(csvData())
clear()
}
// Clear out the Array
func clear() {
for (var i = 0; i < values.count; i++) {
values[i] = ""
}
}
func writeToFile(fileName : String) {
outData.writeToFile(fileName, atomically: true)
}
}
values = [String](count: values.count, repeatedValue: "")
values.removeAll(keepCapacity: true)