【发布时间】:2016-07-04 14:28:21
【问题描述】:
我有一个长字符串(有时超过 1000 个字符),我想将其转换为布尔值数组。而且它需要非常快速地多次执行此操作。
let input: String = "001"
let output: [Bool] = [false, false, true]
我的幼稚尝试是这样的:
input.characters.map { $0 == "1" }
但这比我想要的要慢得多。我的分析告诉我map 是减速的地方,但我不确定我能做到多简单。
我觉得如果没有 Swift/ObjC 的开销,这将是非常糟糕的。在 C 语言中,我认为这是一个简单的 for 循环,其中一个字节的内存与一个常量进行比较,但我不确定我应该查看哪些函数或语法。
有没有办法更快地做到这一点?
更新:
我也试过了
output = []
for char in input.characters {
output.append(char == "1")
}
而且速度提高了大约 15%。我希望的远不止这些。
【问题讨论】:
-
用原始的 for..in 检查
-
@dimpiax 究竟如何?我尝试手动
for循环编辑了这个问题,它确实有点帮助。 -
“001”的样本大小对于实际可测量的差异来说有点小。你能提供更大的样本集吗?您也无法测量循环超过 3 个字符所需的时间有任何差异。 (附加调试器?无效结果!)
-
另外,如果你对 NSString 进行(无桥接)强制转换,你可以使用
.UTF8String()来获取const char *的数组,如果你假设它实际上与布尔数组相同它总是 0 或 1 -
我的实际数据是这些 5 到 1200 个字符长的数据。