如何在swift中处理大字符串?

Gro*_*oup 1 string performance swift

我有这个代码,并且花了很多时间在swift中执行? 每次迭代需要1秒才能执行,为什么?

执行该循环时的CPU百分比为97-98%,能量影响为高

这是守则

     var braces:Int = 1;
     var i:Int = startIndex;
     let jsFileChars = Array(javascriptFile);
      while(i < javascriptFile.count){   //count:1240265        
         if (braces == 0) {
              break;
         }                            
        if (jsFileChars[i] == "{"){     
             braces = braces+1;
         }else if (jsFileChars[i] == "}"){
              braces = braces-1;
         }
             i = i+1;
   }
Run Code Online (Sandbox Code Playgroud)

这个循环以非常缓慢的速度迭代,为什么?

Mar*_*n R 5

循环很慢,因为确定countSwift 字符串是O(N)操作,其中N是字符串中的字符数.另请参阅"Swift编程语言"中的计数字符:

注意

扩展的字形集群可以由多个Unicode标量组成.这意味着不同的字符和相同字符的不同表示可能需要不同的内存量来存储.因此,Swift中的字符不会在字符串表示中占用相同数量的内存.因此,如果不迭代字符串以确定其扩展的字形集群边界,则无法计算字符串中的字符数....

更换javascriptFile.countjsFileChars.count应该已经提高了性能,因为阵列的长度在固定时间内被确定.

更好的是直接迭代字符,而根本不创建数组:

var braces = 1
for char in javascriptFile {
    if char == "{" {
        braces += 1
    } else if char == "}" {
        braces -= 1
    }
}
Run Code Online (Sandbox Code Playgroud)

迭代UTF-16视图甚至更快,因为这是Swift字符串(当前)用作内部存储的:

let openingBrace = "{".utf16.first!
let closingBrace = "}".utf16.first!

var braces = 1
for char in javascriptFile.utf16 {
    if char == openingBrace {
        braces += 1
    } else if char == closingBrace {
        braces -= 1
    }
}
Run Code Online (Sandbox Code Playgroud)