当前位置 : 主页 > 手机开发 > ios >

ios – 极其缓慢地将Objc迁移到快速代码

来源:互联网 收集:自由互联 发布时间:2021-06-11
在我编写的应用程序中,我有一个从Core-Data解析大量数据并将其显示到图形的过程.在进行此处理时,我最终还是将数据写入CSV文件.我创建了一个名为CSVLine的单独类,它可以帮助创建CSV文件
在我编写的应用程序中,我有一个从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()而不是索引添加新值.

网友评论