在我编写的一个应用程序中,我有一个从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)
}
}
我的问题似乎是由于调试版本引起的。在调试构建中没有优化。一旦你运行构建,优化就开始了,运行速度要快得多。。。。
与这里发布的答案类似:斯威夫特处理数字真的很慢吗?
确保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中更改了方法签名 取代这个 用