Coredata和FMDB性能對(duì)比,原來(lái)差距這么大

對(duì)于這兩個(gè)持久化框架一直存在爭(zhēng)議,公司里的項(xiàng)目一直都是會(huì)用coredata,一直對(duì)coredata印象還不錯(cuò),再加上MagicalRecord對(duì)coredata的封裝,使用起來(lái)就更簡(jiǎn)單了。FMDB用的很少,只知道對(duì)數(shù)據(jù)庫(kù)操作都是手寫sql語(yǔ)句執(zhí)行,聽(tīng)起來(lái)性能應(yīng)該更好,所以特意來(lái)對(duì)比一下。

測(cè)試過(guò)程很簡(jiǎn)單,就對(duì)比了個(gè)操作
1:在一個(gè)空表(6個(gè)字段)插入十萬(wàn)條數(shù)據(jù)
2:更新十萬(wàn)數(shù)據(jù)的其中一個(gè)字段

Coredata

用coredata怎么能少得了MagicalRecord框架

  • 集成MagicalRecord
    使用cocoapods集成
  • 創(chuàng)建模型文件和實(shí)體
    這個(gè)表就6個(gè)字段


    QQ20160917-9@2x.png
  • 生成實(shí)體類


    QQ20160917-10@2x.png
  • 初始化數(shù)據(jù)庫(kù)
    在AppDelegate.m添加如下代碼
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [MagicalRecord setDefaultModelNamed:@"Model.momd"];
    [MagicalRecord setupCoreDataStackWithStoreNamed:@"coredataDemo.db"];
    return YES;
}```
- 插入數(shù)據(jù)
點(diǎn)擊屏幕的時(shí)候執(zhí)行

NSLog(@"開(kāi)始存儲(chǔ)");
[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=@"北京天安門廣場(chǎng)101北京天安門廣場(chǎng)101北京天安門廣場(chǎng)101北京天安門廣場(chǎng)101北京天安門廣場(chǎng)101";
user.age=arc4random_uniform(10)+20;
user.gender=i%2;
}
} completion:^(BOOL contextDidSave, NSError * _Nullable error) {
NSLog(@"結(jié)束存儲(chǔ)");
}];

查看本地?cái)?shù)據(jù)庫(kù),驗(yàn)證數(shù)據(jù)是否插入成功

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

結(jié)果如下,耗時(shí)3.6秒
![QQ20160917-1@2x.png](http://upload-images.jianshu.io/upload_images/433584-c4cd4bd57cbaa75d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/600)
- 更新數(shù)據(jù)
將address字段更新,全表1000數(shù)據(jù)

NSLog(@"開(kāi)始更新");
[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(@"結(jié)束更新");
}];

結(jié)果如下,耗時(shí)4.8秒,由于coredata是面對(duì)對(duì)象的數(shù)據(jù)庫(kù),所以必須先把數(shù)據(jù)查出來(lái),然修改對(duì)象的值,再提交保存。所以更新的過(guò)程多了一個(gè)查詢的耗時(shí)
![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'
- 初始化數(shù)據(jù)庫(kù)并建表

-(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(@"建表失敗");
}
}

- 插入操作
和上面一樣,插入十萬(wàn)條數(shù)據(jù),內(nèi)容一樣
```-(void)insert
{
    NSLog(@"開(kāi)始插入");
    for (int i=0; i<100000; i++) {
        NSString *name=[NSString stringWithFormat:@"ygc%d",i];
        NSString *mobilephone=@"13888886666";
        NSString *address=@"北京天安門廣場(chǎng)101北京天安門廣場(chǎng)101北京天安門廣場(chǎng)101北京天安門廣場(chǎng)101北京天安門廣場(chǎng)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(@"結(jié)束插入");
}

執(zhí)行結(jié)果如下,耗時(shí)68秒


QQ20160917-6@2x.png
  • 更新操作
    代碼如下
-(void)update
{
    //開(kāi)始更新
    NSLog(@"開(kāi)始更新");
    [[DBTool sharedInstance].db executeUpdateWithFormat:@"update USER set address=%@",@"上海東方明珠101上海東方明珠101上海東方明珠101上海東方明珠101上海東方明珠101上海東方明珠101"];
    NSLog(@"結(jié)束更新");
}

執(zhí)行結(jié)果如下,耗時(shí)0.3秒,由于直接對(duì)表字段操作,所以速度很快


QQ20160917-7@2x.png

結(jié)果統(tǒng)計(jì)

QQ20160917-5@2x.png

對(duì)比結(jié)果下來(lái),從性能上講,也沒(méi)有絕對(duì)的好與差,得看實(shí)際項(xiàng)目使用情況,并且還有優(yōu)化的空間。不過(guò)從代碼維護(hù)成本和學(xué)習(xí)成本來(lái)講的話,還是coredata簡(jiǎn)單些(入門級(jí)別),語(yǔ)法上也很好接受。我傾向coredata還有一個(gè)很好的功能是coredata可以監(jiān)聽(tīng)一個(gè)表的數(shù)據(jù)變化(NSFeatchResultController),是插入還是刪除,還是修改,配合tableView很好做一些動(dòng)畫。不知道FMDB有沒(méi)有這樣的功能,還是要自己手動(dòng)實(shí)現(xiàn)?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.CoreData 1.1 CoreData概述 1)Core data 是數(shù)據(jù)持久存儲(chǔ)的最佳方式 2)Core...
    微春風(fēng)閱讀 4,001評(píng)論 0 10
  • 大部分人缺乏一種主動(dòng)發(fā)掘信息的意識(shí)。讀著別人寫好的文字,思考著別人提出的問(wèn)題,做著別人交代的事情。 https:/...
    士夢(mèng)閱讀 1,265評(píng)論 0 4
  • 去年冬天開(kāi)始的跑步運(yùn)動(dòng),到現(xiàn)在已有半年多的時(shí)間,每周堅(jiān)持最少跑一次,每次30-50分鐘,偶爾做仰臥起坐。 由一開(kāi)始...
    DDDzz閱讀 343評(píng)論 0 0
  • 活動(dòng)主題:生活不只''杯具''。 主題有兩個(gè)含義:1.目前,杯具已成為''悲劇''的代名詞,可我們不要讓生活...
    Esaias閱讀 245評(píng)論 0 0
  • 佛教所提倡的有滿足之心,是指減少一些沒(méi)有意義的欲望,比如對(duì)錢財(cái)、對(duì)享受,這方面要少欲知足。但在求學(xué)方面,是不需要滿...
    我是大富翁616閱讀 196評(píng)論 0 0

友情鏈接更多精彩內(nèi)容