iphone – 在提取请求模板下面发生什么,提高性能?

iphone – 在提取请求模板下面发生什么,提高性能?,第1张

概述如果创建获取请求模板有一个性能上的提升,而不是以编程方式创建NSFetchRequest,那么我很好奇,所以我写了一些测试来衡量这个。 Here’s the source on github。 模拟器和iPhone上的相同的差异顺序(测量时间间隔做一堆提取): just creating an NSFetchRequest: 4.399674creating a Fetch R 如果创建获取请求模板有一个性能上的提升,而不是以编程方式创建NSFetchRequest,那么我很好奇,所以我写了一些测试来衡量这个。 Here’s the source on github。

模拟器和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 – 在提取请求模板下面发生什么,提高性能?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1039208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存