原创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的性能。
通常,查询一组数据分为几种情况
- 对象在managed context中,这时代价极小,就是内存操作
- 对象最近被取出过,在持久化存储协调器的缓存中,这样的代价也很小。
- 对象需要从文件中取出,这时候代价就很大了。
从文件中取出的时候,要访问文件,并且和当前Context进行合并。所以,能够同时取出的对象,就不要分几次取出。(同时也要考虑到内存问题)
(salary > 5000000) AND (lastName LIKE 'Quincey')
要好于(lastName LIKE 'Quincey') AND (salary > 5000000)
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setFetchLimit:100];
这在之前的一篇文章里我有详解讲解,见这个Link
http://blog.csdn.net/hello_hwc/article/details/46005541
refreshObject:mergeChanges:
大数据的对象例如音乐,视频。这时候建议使用SQLite作为Coredata的词久化存储,因为它能对于扩展到100GB的数据量后依然能够提供很好的性能。对于,大数据的对象,
添加应用参数来log对应的SQLite数据库操作
选择Edite Scheme
添加一行,log对应的数据库操作
-com.apple.CoreData.SQLDebug 1
然后再进行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,可以分析
分析的界面
- Fetches 提供返回对象的数目以及对应的时间
- Saves 纪录save操作以及对应的时间
- Faults 纪录faults触发的对象以及对应的时间
- Cache Misses 纪录fault需要从文件系统而不是cache取出数据的操作
开源工具PonyDebugger
Github地址
https://github.com/square/PonyDebugger
利用这个工具可以查看NSManagedObjectContexts 的所有对象
当然,还有一些图形化的SQlite编辑工具,例如SQLite Professional等等。