模拟器和iPhone上的相同的差异顺序(测量时间间隔做一堆提取):
just creating an NSFetchRequest: 4.399674creating a Fetch Request Template: 0.501369NSFetchRequest with fIEld indexed: 0.407068Fetch Request Template and fIEld indexed: 0.281876
事实证明,创建一个获取请求模板时,大概有7〜9倍的性能提升。我以为也许是在下面创建适当的索引,但是当我创建了一个在索引字段上匹配的Fetch Request Template时,甚至还有一个性能优势。
好的,很高兴知道这是这种情况,但是我非常想知道在提取请求模板下面发生了什么,这些模板考虑到性能提升?
解决方法 更新在使用乐器进行一些分析之后,事实证明[nspredicate predicateWithFormat:]不是这里的罪魁祸首!
性能差异的实际原因是排序描述符。
非模板测试正在使用NSFetchedResultsController,它需要排序描述符,而基于模板的则不会指定排序描述符。
如果您添加一个排序描述符到所有的测试,性能将被提升(除索引的情况除外)。
原来(错)答案
性能损失是因为您的“只创建NSFetchRequest”测试为循环的每次迭代调用[nspredicate predicateWithFormat:] – 这是非常慢的!
想想一下 – [nspredicate predicateWithFormat:]必须解析字符串,并将其基本编译为Core Data使用的内部表示。
通常的解决方案是只调用[nspredicate predicateWithFormat:]一次,然后使用[nspredicate predicateWithSubstitutionVariables:]来指定要被谓词比较的值 – 这在Core Data Documentation – Efficiently Importing Data
总结To create a predicate from a formatted string,the framework must parse the string and create instances of predicate and Expression objects. If you are using the same form of a predicate many times over but changing the value of one of the constant value Expressions on each use,it is more efficIEnt to create a predicate once and then use variable substitution (see “Creating Predicates”).
以上是内存溢出为你收集整理的iphone – 在提取请求模板下面发生什么,提高性能?全部内容,希望文章能够帮你解决iphone – 在提取请求模板下面发生什么,提高性能?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)