Coredata和FMDB性能对比,原来差距这么大

对于这两个持久化框架一直存在争议,公司里的项目一直都是会用coredata,一直对coredata印象还不错,再加上MagicalRecord对coredata的封装,使用起来就更简单了。FMDB用的很少,只知道对数据库操作都是手写sql语句执行,听起来性能应该更好,所以特意来对比一下。

测试过程很简单,就对比了个操作
1:在一个空表(6个字段)插入十万条数据
2:更新十万数据的其中一个字段

Coredata

用coredata怎么能少得了MagicalRecord框架

  • 集成MagicalRecord
    使用cocoapods集成
  • 创建模型文件和实体
    这个表就6个字段


    QQ20160917-9@2x.png
  • 生成实体类


    QQ20160917-10@2x.png
  • 初始化数据库
    在AppDelegate.m添加如下代码
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [MagicalRecord setDefaultModelNamed:@"Model.momd"];
    [MagicalRecord setupCoreDataStackWithStoreNamed:@"coredataDemo.db"];
    return YES;
}```
- 插入数据
点击屏幕的时候执行

NSLog(@"开始存储");
[MagicalRecord saveWithBlock:^(NSManagedObjectContext * _Nonnull localContext) {
for (int i=0; i<100000; i++) {
User *user=[User MR_createEntityInContext:localContext];
user.id=1000+i;
user.name=[NSString stringWithFormat:@"ygc%d",i];
user.mobilephone=@"13888886666";
user.address=@"北京天安门广场101北京天安门广场101北京天安门广场101北京天安门广场101北京天安门广场101";
user.age=arc4random_uniform(10)+20;
user.gender=i%2;
}
} completion:^(BOOL contextDidSave, NSError * _Nullable error) {
NSLog(@"结束存储");
}];

查看本地数据库,验证数据是否插入成功

![QQ20160917-2@2x.png](http://upload-images.jianshu.io/upload_images/433584-1c8793939f342c41.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/600)

结果如下,耗时3.6秒
![QQ20160917-1@2x.png](http://upload-images.jianshu.io/upload_images/433584-c4cd4bd57cbaa75d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/600)
- 更新数据
将address字段更新,全表1000数据

NSLog(@"开始更新");
[MagicalRecord saveWithBlock:^(NSManagedObjectContext * _Nonnull localContext) {
NSArray *users=[User MR_findAllInContext:localContext];
if(users)
{
for (User *user in users) {
user.address=@"上海东方明珠101上海东方明珠101上海东方明珠101上海东方明珠101上海东方明珠101上海东方明珠101";
}
}
} completion:^(BOOL contextDidSave, NSError * _Nullable error) {
NSLog(@"结束更新");
}];

结果如下,耗时4.8秒,由于coredata是面对对象的数据库,所以必须先把数据查出来,然修改对象的值,再提交保存。所以更新的过程多了一个查询的耗时
![QQ20160917-3@2x.png](http://upload-images.jianshu.io/upload_images/433584-215af0ccfd3bf524.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

###FMDB
- 集成FMDB
使用cocoapods集成
 pod 'MagicalRecord', '~> 2.3.2'
- 初始化数据库并建表

-(void)setUpDatabase
{
if(!_db)
{
NSString *path=[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"fmdb.db"];
FMDatabase *db=[FMDatabase databaseWithPath:path];
if([db open])
{
_db=db;
[self createTables];
}
}
}

-(void)createTables
{
NSString *query=@"CREATE TABLE USER ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, gender INTEGER, address VARCHAR, mobilphone VARCHAR )";
if([self.db executeUpdate:query])
{
NSLog(@"建表成功");
}
else
{
NSLog(@"建表失败");
}
}

- 插入操作
和上面一样,插入十万条数据,内容一样
```-(void)insert
{
    NSLog(@"开始插入");
    for (int i=0; i<100000; i++) {
        NSString *name=[NSString stringWithFormat:@"ygc%d",i];
        NSString *mobilephone=@"13888886666";
        NSString *address=@"北京天安门广场101北京天安门广场101北京天安门广场101北京天安门广场101北京天安门广场101";
        NSUInteger age=arc4random_uniform(10)+20;
        NSUInteger gender=i%2;
        
        BOOL succes= [[DBTool sharedInstance].db executeUpdateWithFormat:@"insert into USER(name,age,gender,address,mobilphone) values (%@,%d,%d,%@,%@)",name,age,gender,address,mobilephone];
    }
    
    NSLog(@"结束插入");
}

执行结果如下,耗时68秒


QQ20160917-6@2x.png
  • 更新操作
    代码如下
-(void)update
{
    //开始更新
    NSLog(@"开始更新");
    [[DBTool sharedInstance].db executeUpdateWithFormat:@"update USER set address=%@",@"上海东方明珠101上海东方明珠101上海东方明珠101上海东方明珠101上海东方明珠101上海东方明珠101"];
    NSLog(@"结束更新");
}

执行结果如下,耗时0.3秒,由于直接对表字段操作,所以速度很快


QQ20160917-7@2x.png

结果统计

QQ20160917-5@2x.png

对比结果下来,从性能上讲,也没有绝对的好与差,得看实际项目使用情况,并且还有优化的空间。不过从代码维护成本和学习成本来讲的话,还是coredata简单些(入门级别),语法上也很好接受。我倾向coredata还有一个很好的功能是coredata可以监听一个表的数据变化(NSFeatchResultController),是插入还是删除,还是修改,配合tableView很好做一些动画。不知道FMDB有没有这样的功能,还是要自己手动实现?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 1.CoreData 1.1 CoreData概述 1)Core data 是数据持久存储的最佳方式 2)Core...
    微春风阅读 3,792评论 0 10
  • 大部分人缺乏一种主动发掘信息的意识。读着别人写好的文字,思考着别人提出的问题,做着别人交代的事情。 https:/...
    士梦阅读 1,152评论 0 4
  • 去年冬天开始的跑步运动,到现在已有半年多的时间,每周坚持最少跑一次,每次30-50分钟,偶尔做仰卧起坐。 由一开始...
    DDDzz阅读 278评论 0 0
  • 活动主题:生活不只''杯具''。 主题有两个含义:1.目前,杯具已成为''悲剧''的代名词,可我们不要让生活...
    Esaias阅读 204评论 0 0
  • 佛教所提倡的有满足之心,是指减少一些没有意义的欲望,比如对钱财、对享受,这方面要少欲知足。但在求学方面,是不需要满...
    我是大富翁616阅读 170评论 0 0