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