首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Cocoa/Objective-C搜索

优化Cocoa/Objective-C搜索
EN

Stack Overflow用户
提问于 2009-07-01 16:36:37
回答 7查看 2K关注 0票数 1

我正在搜索一个大的plist文件,其中包含了数万个字典,每个字典都有两个键/字符串对。我的搜索算法遍历字典,当它在字典中的任何一个字符串中找到文本匹配时,就会插入字典的内容。下面是它的工作原理:

代码语言:javascript
复制
NSDictionary *eachEntry;
NSArray *rawGlossaryArray = [[NSArray alloc] initWithContentsOfFile:thePath]; // this contains the contents of the plist

for (eachEntry in rawGlossaryArray)
    {
        GlossaryEntry *anEntry = [[GlossaryEntry alloc] initWithDictionary:eachEntry];


        NSRange titleResultsRange = [anEntry.title rangeOfString:filterString options:NSCaseInsensitiveSearch];
        NSRange defResultsRange = [anEntry.definition rangeOfString:filterString options:NSCaseInsensitiveSearch];

        if (titleResultsRange.length > 0 || defResultsRange.length > 0) {
            // store that item in the glossary dictionary with the name as the key
            [glossaryDictionary setObject:anEntry forKey:anEntry.title];

        }
        [anEntry release];
    }

每次执行搜索时,我的iPhone应用程序都会有大约3-4秒的延迟(至少在设备上是这样;在模拟器中一切都运行得相当快)。有人能建议我如何优化这个搜索吗?

EN

回答 7

Stack Overflow用户

发布于 2009-07-01 17:32:03

如果不看数据集,我就不能确定,但如果你分析它,你会把大部分时间花在-rangeOfString:options:上。如果是这样的话,如果不从根本上改变用来存储数据的数据结构,您将无法提高性能。

您可能希望使用指向对象的字符串和子字符串来构造一些排序trie。它的设置要复杂得多,插入它的代价也会更高,但查找速度会非常快。既然您无论如何都要序列化结构,那么昂贵的插入应该不是什么大问题。

票数 2
EN

Stack Overflow用户

发布于 2009-07-01 21:30:03

这就需要使用数据库,您预先填充数据库并放入应用程序中。

票数 2
EN

Stack Overflow用户

发布于 2009-07-01 16:45:58

以下是一些建议:

在这个循环中,你做了大量的分配和释放。,,

  1. 。你能在循环之前创建一个GlossaryEntry,然后在循环中重新加载它的内容吗?与每次加载文件相比,这将避免大量的alloc/releases.
  2. Rather,您可以延迟加载一次并将其缓存在内存中(可能是在单例类型的对象中)吗?一般来说,这在iPhone上不是一个好主意,但您可以在"didReceiveMemoryWarning“处理程序中包含一些代码,以便在缓存出现问题时释放它。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1070140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档