【问题标题】:SWIFT: performance of uppercaseStringSWIFT:大写字符串的性能
【发布时间】:2015-07-31 12:51:36
【问题描述】:

我有一个大文件 (25 MB) 的文本。我将它读入一个 NSString 变量。我想使用“大写字符串”将每个字符转换为大写。但是这个功能非常慢,需要几分钟。 有什么技巧可以让它更快地工作吗?

添加代码:

if let path = NSBundle.mainBundle().pathForResource("GERMANU", ofType: "txt") {
    var error: NSError?
    if let data = NSData(contentsOfFile: path, options: NSDataReadingOptions(), error: &error) {           
        if let datastring = NSString(data: data, encoding: NSMacOSRomanStringEncoding) {
            var upper = datastring.uppercaseString
 ...

这是有效的代码,但速度很慢。只有最后一行需要一直。

【问题讨论】:

  • 哪个需要更长的时间 - 从文件中读取字符串或将其转换为大写?如果转换为大写是瞬时的,那么性能可能仍然“非常慢”。
  • 读取字符串是在一个刻度内完成的。这就是奇怪的事情!更改内存中的字符串需要很多时间。即使将数据拆分为单独的字符串并将它们插入数组中也快得多。所以一定有一种行为需要避免。
  • 它做到了。往上看。 :-)

标签: string performance swift nsstring


【解决方案1】:

String::uppercaseString 是瞬时的;创建字符串不是。

 # Long time
 12> var st : String = "".join(Array(count:25000000, repeatedValue: "a")) 
st: String = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..."

 # Short time
 13> st.uppercaseString
$R8: String = "AAAAAAAAAAAAAAAAAAAAAAAAAAAA..."

鉴于您使用的是Roman 编码,转换为大写字母可能并非易事。也许您可以尝试另一种编码(如果其他编码合适的话)?您可以尝试使用init?(... usedEncoding ...) 变体并在结果上调用fastestEncoding 来探索一下。

注意:您可以使用以下方法直接从具有特定编码的文件创建 Swift 字符串:

if let datastring = String(contentsOfFile: path, encoding: ... , error: &error) {
  var upper = datastring.uppercaseString
}

【讨论】:

  • 但这正是我所做的。这很慢: var upper = datastring.uppercaseString
【解决方案2】:

对我来说,它看起来像是一个糟糕的库实现。使用NSString.uppercaseString() 非常快(半秒)。所以我会使用它,但我正在使用 Swift 进行开发,因为我喜欢这种语言。所以我不想切换回旧的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多