将两个字符串转换为布尔数组的快速方法是什么?

Ale*_*yne 12 ios swift

我有一个长字符串(有时超过1000个字符),我想转换为布尔值数组.它需要很快完成这么多次.

let input: String = "001"
let output: [Bool] = [false, false, true]
Run Code Online (Sandbox Code Playgroud)

我天真的尝试是这样的:

input.characters.map { $0 == "1" }
Run Code Online (Sandbox Code Playgroud)

但这比我想要的要慢很多.我的分析告诉我,这map是减速的地方,但我不确定我能做多少简单.

如果没有Swift/ObjC的开销,我觉得这会很快.在C中,我认为这是一个简单的for循环,其中一个字节的内存与一个常量进行比较,但我不确定我应该看到的函数或语法是什么.

有没有办法更快地做到这一点?

更新:

我也试过了

output = []
for char in input.characters {
    output.append(char == "1")
}
Run Code Online (Sandbox Code Playgroud)

它的速度提高了约15%.我希望远不止这些.

dim*_*iax 13

这更快:

// Algorithm 'A'
let input = "0101010110010101010"
var output = Array<Bool>(count: input.characters.count, repeatedValue: false)
for (index, char) in input.characters.enumerate() where char == "1" {
    output[index] = true
}
Run Code Online (Sandbox Code Playgroud)

更新:下 input = "010101011010101001000100000011010101010101010101"

0.0741/0.0087,这种方法比作者的速度快8.46倍.随着更大的数据相关性更积极.

此外,使用nulTerminatedUTF8速度稍微增加,但并不总是比算法A更高:

// Algorithm 'B'
let input = "10101010101011111110101000010100101001010101"
var output = Array<Bool>(count: input.nulTerminatedUTF8.count, repeatedValue: false)
for (index, code) in input.nulTerminatedUTF8.enumerate() where code == 49 {
    output[index] = true
}
Run Code Online (Sandbox Code Playgroud)

在结果图中出现,输入长度为2196,其中第一个和最后一个0..1,A - 第二个,B - 第三个点. A:0.311sec,B:0.304sec

算法比较图


Pra*_*p K 5

import Foundation

let input:String = "010101011001010101001010101100101010100101010110010101010101011001010101001010101100101010100101010101011001010101001010101100101010100101010"
var start  = clock()
var output = Array<Bool>(count: input.nulTerminatedUTF8.count, repeatedValue: false)
var index = 0
for val in input.nulTerminatedUTF8 {
    if val != 49 {
        output[index] = true
    }
    index+=1
}
var diff = clock() - start;
var msec = diff * 1000 / UInt(CLOCKS_PER_SEC);
print("Time taken \(Double(msec)/1000.0) seconds \(msec%1000) milliseconds");
Run Code Online (Sandbox Code Playgroud)

这应该非常快.试试看.因为010101011010101001000100000011010101010101010101它需要0.039秒.