当前位置: 首页 > 知识库问答 >
问题:

将Objc迁移到swift代码的速度非常慢

华锦程
2023-03-14

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

使用仪器,我能够识别“慢”方法,我想知道我是否在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] = @"";
    }
}
func newLine() {
    outData.appendData(csvData())
    clear()
}


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

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

例子:

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

值可能为[200300,“,”“]

或[“”、“”、“38.553”、“25.2256”]

完成一行后,我将把一个逗号连接的值列表写入内部数据结构,并清除该行(删除值数组中的所有项)。这似乎是斯威夫特阶层放缓的原因。当我将数组归零时,是否有明显的“缓慢”动作?

@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)
    }
   
}

共有2个答案

阴波峻
2023-03-14

我的问题似乎是由于调试版本引起的。在调试构建中没有优化。一旦你运行构建,优化就开始了,运行速度要快得多。。。。

与这里发布的答案类似:斯威夫特处理数字真的很慢吗?

逄嘉木
2023-03-14

确保Swift在构建设置中的优化级别不是-Onone。根据我的经验,它比-O慢几个数量级。(-O也是“发布”的默认值,因此您也可以简单地为发布构建,正如已经建议的那样。)至于“归零”数组,简单地用重复的值重新初始化数组可能会更快(尽管我不知道):

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

或者,如果您知道将在执行过程中附加新值,并且不一定要使用索引,则可以调用:

values.removeAll(keepCapacity: true)

并将新值与值相加。append()而不是at索引。

 类似资料:
  • 问题内容: 我正在将Java代码库迁移到纯Scala,并且只能使用这一段代码。我有一个IntervalMap的实现,即一个数据结构,可让您有效地将范围映射到,和操作全部所在的位置(与IntervalTree或SegmentTree略有不同)。 这段代码使用Java,并且在迁移到Scala时遇到了两个大问题: Scala没有-我决定使用(奇怪的Scala有但没有)存储密钥并将值存储在辅助中来解决它。

  • 问题内容: 我正在从elasticsearch1.4.3迁移到2.4,并替换了elasticsearch文档中引用的一段代码,而其他参考则需要替换andFilter? 码:- 问题答案: 您可以这样做:

  • 我升级为不和谐。JSV12,但它破坏了我现有的v11代码。下面是一些导致错误的示例: 如何将代码迁移到Discord。JSV12并修复这些错误?在哪里可以看到v12引入的突破性更改?

  • Spring云流是否支持下面的Kafka流应用程序。下面是Kafka示例应用程序摘录中的代码。感谢您的任何反馈或支持。

  • Pillow 是对 PIL 的功能增加,想要在 Pillow 下运行 PIL 的代码,只需要: 把这个: import Image 修改成: from PIL import Image 注意,:py:mod:`_imaging` 模块已经被移除,现在可以这样导入:: from PIL.Image import core as _imaging 另外,图像插件导入机制已经改变。Pi

  • 问题内容: 这个问题可能已经回答了,但我找不到。 这段代码在swift 2中工作正常,但是现在给我一个错误,以删除替代。 确切的错误:“方法不会覆盖其超类中的任何方法” 快速3的新正确方法是什么? 我似乎在任何地方都找不到任何文档。 问题答案: 在Swift 3.0中更改了方法签名 取代这个 用