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閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容

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