iOS CoreData详解(七)性能相关

原创blog,转载请注明出处
blog.csdn.net/hello_hwc
欢迎关注我的iOS SDK详解专栏,这里有很多基础的文章
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html

前言:总的来说,CoreData的性能是很好的,尤其是对于数据量较小的App,但是CoreData很有可能会被滥用,导致App的性能下降。当数据量较大的时候,开发者也要权衡是直接使用SQLite还是使用CoreData,这个后续我会继续比较。

本文会从几个方面来讲解CoreData的性能。

  1. 查询数据
  2. 降低内存使用
  3. 大量数据的处理
  4. 如何分析性能问题

查询优化

通常,查询一组数据分为几种情况

  1. 对象在managed context中,这时代价极小,就是内存操作
  2. 对象最近被取出过,在持久化存储协调器的缓存中,这样的代价也很小。
  3. 对象需要从文件中取出,这时候代价就很大了。

从文件中取出的时候,要访问文件,并且和当前Context进行合并。所以,能够同时取出的对象,就不要分几次取出。(同时也要考虑到内存问题)

设置合理的Predicates

  1. 查询字符串的速度要慢于查询,所以(salary > 5000000) AND (lastName LIKE 'Quincey')要好于(lastName LIKE 'Quincey') AND (salary > 5000000)
  2. 只fetch那些需要的数据。对于少量的数据,只需要使用Fetch Limits就行了,如果要使用大量数据,则通常要两个Fetch,第一个Fetch取出少量数据即刻为UI服务,另一个Fetch取出大量数据。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setFetchLimit:100];

Faulting 技术

这在之前的一篇文章里我有详解讲解,见这个Link
http://blog.csdn.net/hello_hwc/article/details/46005541

降低内存使用

  • 可以对不需要的对象re-faulting,调用refreshObject:mergeChanges:
  • 设置includesPropertyValues为NO,来保证惰性加载
  • 可以调用NSManagedObjectContext的reset方法来清空
  • 在不需要undo的工程,可以将undo manager设为nil

大量数据的对象

大数据的对象例如音乐,视频。这时候建议使用SQLite作为Coredata的词久化存储,因为它能对于扩展到100GB的数据量后依然能够提供很好的性能。对于,大数据的对象,

  • 存储到磁盘上,然后CoreData存储对应的URL,往往能够提高性能
  • 另外,合理利用Coredata的惰性加载机制,把各个属性分离到不同的对象中,例如,人一个对象,照片一个对象,二者通过Relationship联系起来,就能够保证在需要照片的时候再惰性加载

性能分析

添加应用参数来log对应的SQLite数据库操作
选择Edite Scheme
iOS CoreData详解(七)性能相关_第1张图片
添加一行,log对应的数据库操作

-com.apple.CoreData.SQLDebug 1

如图
iOS CoreData详解(七)性能相关_第2张图片

然后再进行CoreData操作,会看到如图的log信息

用终端查看数据库的信息
打开终端,到对应的sqlite数据库文件目录下

cd /Users/huangwenchen/Library/Developer/CoreSimulator/Devices/84EFC913-A144-4607-95AF-1BC5A81AC633/data/Containers/Data/Application/686ACB9B-C2B9-41AA-8567-792B0306DA12/Documents/

打开sqlite终端-我写博客的时候版本是sqlite3

printer-shn15-10-140-28-14:Documents huangwenchen$ ls
CoreDataDemo.sqlite CoreDataDemo.sqlite-shm CoreDataDemo.sqlite-wal
printer-shn15-10-140-28-14:Documents huangwenchen$ sqlite3 CoreDataDemo.sqlite
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> 

然后,用对应的sqlite语法进行查询,这里不详细阐述
例如,查看数据库schema

sqlite> select * from sqlite_master;
table|ZDEPARTMENT|ZDEPARTMENT|3|CREATE TABLE ZDEPARTMENT ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZFLOOR INTEGER, ZNAME VARCHAR )
table|ZEMPLOYEE|ZEMPLOYEE|4|CREATE TABLE ZEMPLOYEE ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZAGE INTEGER, ZDEPARTMENT INTEGER, ZIDENTIFIER VARCHAR, ZNAME VARCHAR )
index|ZEMPLOYEE_ZDEPARTMENT_INDEX|ZEMPLOYEE|5|CREATE INDEX ZEMPLOYEE_ZDEPARTMENT_INDEX ON ZEMPLOYEE (ZDEPARTMENT)
table|Z_PRIMARYKEY|Z_PRIMARYKEY|6|CREATE TABLE Z_PRIMARYKEY (Z_ENT INTEGER PRIMARY KEY, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER)
table|Z_METADATA|Z_METADATA|7|CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB)
sqlite> 

Instruments
Instruments有一个工具叫做CoreData,可以分析

分析的界面

iOS CoreData详解(七)性能相关_第3张图片

  • Fetches 提供返回对象的数目以及对应的时间
  • Saves 纪录save操作以及对应的时间
  • Faults 纪录faults触发的对象以及对应的时间
  • Cache Misses 纪录fault需要从文件系统而不是cache取出数据的操作

开源工具PonyDebugger
Github地址
https://github.com/square/PonyDebugger
利用这个工具可以查看NSManagedObjectContexts 的所有对象
iOS CoreData详解(七)性能相关_第4张图片

当然,还有一些图形化的SQlite编辑工具,例如SQLite Professional等等。

你可能感兴趣的:(ios,性能,coredata)