gpt4 book ai didi

ios - 非常缓慢地将 Objc 迁移到 swift 代码

转载 作者:搜寻专家 更新时间:2023-10-31 22:03:46 26 4
gpt4 key购买 nike

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

使用 Instruments 我能够识别“慢”方法,我想知道我是否在 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] = @"";
}
}

swift

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


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

我正在处理各种类型的数据,这些数据都被写入到一个 CSV 文件中,因此有很多空行。为了适应这一点,我设计了这个类,使其具有一个 keys 数组和一个 values 数组。 keys 存储 CSV 文件的“列”名称,values 将存储该数据元素的 key 索引的空白或值。

例子:

键 = [速度、航向、纬度、经度]

值可能是 [200,300,"",""]

或 ["","","38.553","25.2256"]

一旦我完成了一行,我会将一个逗号连接的值列表写入内部数据结构并清除该行(删除 values 数组中的所有项目)。这似乎是 swift 类减速的地方。 当我将数组清零时,我在做什么明显“慢”的事情吗?

完整的 Swift 类

@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 也是“发布”的默认值,因此您也可以像已经建议的那样简单地为发布构建。)至于“清零”数组,可能更快(虽然我不知道)简单地重新 -使用重复值初始化数组:

values = [String](count: values.count, repeatedValue: "")

或者,如果您知道您将在进行过程中追加新值,并且不必使用索引,您可以调用:

values.removeAll(keepCapacity: true)

并使用 values.append() 而不是在索引处添加新值。

关于ios - 非常缓慢地将 Objc 迁移到 swift 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25814841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com