在我编写的应用程序中,我有一个从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] = @""; } }
迅速
func newLine() { outData.appendData(csvData()) clear() } // Clear out the Array func clear() { for (var i = 0; i < values.count; i++) { values[i] = "" } }
我正在使用各种类型的数据,这些数据都写入单个CSV文件,因此有许多空白行.为了适应这一点,我设计了这个类,使它有一个键数组和一个值数组.密钥存储CSV文件的“列”名称,值将存储空白或该数据元素的键索引的值.
例:
Keys = [speed,heading,lat,lon]
值可能是[200,300,“”,“”]
或[“”,“”,“38.553”,“25.2256”]
一旦我完成了一行,我将把一个逗号加入的值列表写入内部数据结构并清除该行(擦除values数组中的所有项).这似乎是减速与快速阶级的关系.当我把我的阵列归零时,有什么明显的“缓慢”吗?
全速类
@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) } }确保Swift在Build Settings中的优化级别不是-Onone.根据我的经验,它比-O慢几个数量级. (-O也是’release’的默认值,所以或者你可以简单地构建for release,就像已经建议的那样.)至于’清零’数组,它可能更快(虽然我不知道)简单地重新使用重复值初始化数组:
values = [String](count: values.count, repeatedValue: "")
或者,如果您知道在进行过程中将附加新值,并且不必使用索引,则可以调用:
values.removeAll(keepCapacity: true)
并使用values.append()而不是索引添加新值.