[英]Improve search performance in objective-c
我正在一个函数中搜索大约100k个字符串:
results = [NSMutableArray new];
for (int n = 0; n < (int)_donkey.searchStrings.count; n++){
if ([[_donkey.searchStrings[n] lowercaseString] rangeOfString:tf.text.lowercaseString].location != NSNotFound){
[results addObject:_donkey.formattedStrings[n]];
}
}
其中tf.text
是用户在UITextField
输入的文本。 性能很慢,给我的印象是总有一种更好的搜索方法,而不是直接进行字符串比较。
所搜索的字符串的格式如下:“ attributeA attributeB attributeC”,因此,如果在attributeA之前输入attributeB,则结果不会出现,应该这样。
一些明显的事情:
searchStrings
属性的getter方法。 调用一次并将其缓存在本地变量中。 count
getter。 text
。 lowercaseString
,请不要在每次循环迭代时都在文本字段的字符串上调用它。 但请参阅下一项。 lowercaseString
。 使用-rangeOfString:options:
和NSCaseInsensitiveSearch
选项, -localizedCaseInsensitiveContainsString:
或-localizedStandardContainsString:
它们不仅可能更快,而且更正确。 (语言可能很奇怪,比较小写字符串不一定与不区分大小写的比较相同。) searchStrings
的匹配元素的索引构建数组,因此可以使用-indexesOfObjectsWithOptions:passingTest:
来构建匹配元素的索引集。 在这种情况下,您不必自己编写(慢速)枚举代码。 您还可以在选项中指定NSEnumerationConcurrent
,以允许框架使用多个线程来执行搜索。 设置索引后,可以使用-objectsAtIndexes:
从formattedStrings
获取相应元素的数组。 同样,该框架比在可变数组中一次构建一个元素的方法要快。 (感谢@rmaddy的建议。) 所搜索的字符串的格式如下:“ attributeA attributeB attributeC”,因此,如果在attributeA之前输入attributeB,则结果不会出现,应该这样。
我不理解您问题的这一部分,似乎是关于正确性而不是性能。 因此:1)在关注性能之前首先要获得正确性。 毫无意义地使错误的算法更快。 2)这应该是一个单独的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.