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

Ios 非常缓慢地将Objc迁移到swift代码,ios,objective-c,swift,Ios,Objective C,Swift,在我编写的应用程序中,我有一个从核心数据解析大量数据并将其显示为图形的过程。在进行此处理时,我还将数据写入CSV文件。我创建了一个名为CSVLine的单独类,它帮助创建CSV文件。 对于我记录的140k测试用例,我的Objective-C代码运行大约需要12秒。在将类“迁移”到swift之后,现在运行大约需要280-360秒。显然我做了一些可怕的事 使用仪器,我能够识别出“慢”的方法,我想知道我是否在SWIFT中做了一些明确的事情,导致了这个问题 Objc 我的问题似乎是由调试生成引起的。在调试

在我编写的应用程序中,我有一个从核心数据解析大量数据并将其显示为图形的过程。在进行此处理时,我还将数据写入CSV文件。我创建了一个名为CSVLine的单独类,它帮助创建CSV文件。
对于我记录的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)