我有一个很长的字符串(有时超过 1000 个字符),我想将其转换为布尔值数组。它需要非常快速地多次执行此操作。
let input: String = "001"
let output: [Bool] = [false, false, true]
我天真的尝试是这样的:
input.characters.map { $0 == "1" }
但这比我想要的要慢得多。我的分析表明map
这就是速度放缓的地方,但我不确定我能把它变得简单多少。
我觉得如果没有 Swift/ObjC 的开销,这会很快。在C中,我认为这是一个简单的for
循环,其中将内存字节与常量进行比较,但我不确定我应该查看的函数或语法是什么。
有没有办法更快地做到这一点?
UPDATE:
我也尝试过一个
output = []
for char in input.characters {
output.append(char == "1")
}
而且速度快了大约 15%。我的希望远不止于此。
这更快:
// 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
}
更新:下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
}
在结果图中出现,带有输入长度2196,其中第一个和最后一个 0..1,A – 第二个点,B – 第三个点。A:0.311秒,B:0.304秒
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)