繁体   English   中英

提高Objective-C的搜索效果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM