美文网首页
fmdb学习

fmdb学习

作者: CAICAI0 | 来源:发表于2018-02-09 13:58 被阅读10次

    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隐式生成事务效率稍高。

    相关文章

      网友评论

          本文标题:fmdb学习

          本文链接:https://www.haomeiwen.com/subject/sxbftftx.html