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

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

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

Coredata

用coredata怎么能少得了MagicalRecord框架

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


  • 生成实体类


  • 初始化数据库
    在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(@"结束存储");
}];

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

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

结果如下,耗时3.6秒
![[email protected]](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是面对对象的数据库,所以必须先把数据查出来,然修改对象的值,再提交保存。所以更新的过程多了一个查询的耗时
![[email protected]](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秒


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

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


结果统计

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

你可能感兴趣的:(Coredata和FMDB性能对比,原来差距这么大)