fmdb学习

FMDatabaseQueue 中使用事务与不使用事务性能对比,一下为简单的插入语句执行结果

//事务
[fqueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
    NSLog(@"start");
    for (NSInteger i=0; i<1000; i++) {
        if ([db executeUpdate:@"INSERT INTO person VALUES (?, ?, ?)", @(i+5), @"Jemmy", @(i)]) {
            NSLog(@"Jemmy 插入成功 - %@", [NSThread currentThread]);
        }else{
            *rollback = true;
        }
    }
    NSLog(@"end");
}];
  //直接插入
[fqueue inDatabase:^(FMDatabase * _Nonnull db) {
    NSLog(@"start");
    for (NSInteger i=0; i<1000; i++) {
        if ([db executeUpdate:@"INSERT INTO person VALUES (?, ?, ?)", @(i+5), @"Jemmy", @(i)]) {
            NSLog(@"Jemmy 插入成功 - %@", [NSThread currentThread]);
        }
    }
    NSLog(@"end");
}];

结果

事务 100
2018-02-09 13:45:58.942268+0800 fmdb[81974:4828724] start
2018-02-09 13:45:59.012494+0800 fmdb[81974:4828724] end
    0.070226

事务 1000
2018-02-09 13:47:48.655100+0800 fmdb[82028:4839212] start
2018-02-09 13:47:49.513091+0800 fmdb[82028:4839212] end
    0.857991

非  100
2018-02-09 13:50:02.857010+0800 fmdb[82082:4851511] start
2018-02-09 13:50:07.000350+0800 fmdb[82082:4851511] end
    4.14334

非  1000
2018-02-09 13:51:37.937383+0800 fmdb[82165:4858006] start
2018-02-09 13:51:46.728275+0800 fmdb[82165:4858006] end
    8.790892

sqlite 数据库,普通操作也会自动生成事务。一秒内最多提交事务的数量大概是100个,一个事务里面一秒内插入语句执行数量大概是1000个。所以如果批量操作使用一个事务处理会提高性能。

NSLog(@"start");
for (NSInteger i=0; i<1000; i++) {
    [fqueue inDatabase:^(FMDatabase * _Nonnull db) {
        if ([db executeUpdate:@"INSERT INTO person VALUES (?, ?, ?)", @(i+5), @"Jemmy", @(i)]) {
            NSLog(@"Jemmy 插入成功 - %@", [NSThread currentThread]);
        }
    }];
}
NSLog(@"end");

结果

2018-02-09 15:16:11.224784+0800 fmdb[88948:5164203] start
2018-02-09 15:16:14.545109+0800 fmdb[88948:5164203] end
3.320325

for循环在线程队列外执行结果,比在队列内执行更省时间。

NSLog(@"start");
for (NSInteger i=0; i<1000; i++) {
    [fqueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        if ([db executeUpdate:@"INSERT INTO person VALUES (?, ?, ?)", @(i+5), @"Jemmy", @(i)]) {
            NSLog(@"Jemmy 插入成功 - %@", [NSThread currentThread]);
        }else{
            *rollback = true;
        }
    }];
}
NSLog(@"end");

结果

2018-02-09 15:29:03.855980+0800 fmdb[89098:5233353] start
2018-02-09 15:29:06.499058+0800 fmdb[89098:5233353] end
2.643078

一样简单插入语句在手动生成的事务里面执行,效率会比sqlite隐式生成事务效率稍高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • TopicList 一.FMDB 简介 二.FMDB 使用说明 三.FMDB 创建及使用方法 四.FMDataba...
    爨乡的云阅读 5,939评论 5 49
  • 最近在做一个项目需要用到持久性存储,在Core Data以及FMDB中选择用哪个比较好,最后使用了FMDB,主要是...
    满大街都是大卡车阅读 602评论 1 0
  • 北京时间去年的3月9日,谷歌智能计算机AlphaGo在与人类顶尖围棋手李世石的对弈中,以4:1结束比赛,这件事很快...
    小小Mark阅读 1,106评论 4 1
  • 我站在 青岛火车站前广场 此时此地 头顶的海鸥 盘旋南飞 夕阳 染红双眸 手里是K1052 青岛北到淮南 又浮现 ...
    紫云路7号阅读 174评论 0 0
  • 今天从上海回来了,回到家感觉自己还是没有很多的情感流露,还是趋向冷冰冰的,同时感觉自己在家里开始活的越来越舒服了,...
    Hi_张阅读 189评论 0 0