Android Benchmark 运行方法

使用 Android Studio 打开 android 目录工程,其中可以找到 benchmark 模块。Benchmark 用 Instrumented Unit Test 实现,分开不同用例,要执行对应的用例,右键点击对应的测试类,选择 "Run 'xxx'" 即可在手机上运行。

添加自己的 Benchmark Case

如果需要增加自己的测试项目(比如使用不同的库,或不同的配置参数),派生对应的测试基类并实现其中打开、查询等接口,即可快速实现新的测试用例。具体可以参见 SingleThreadedTest(基类)和 WCDBSingleThreadedTestFrameworkSingleThreadedTest(派生测试类)。

Single-threaded Test

测试单线程 DB 读写性能,有以下用例:

  • Create: 打开 DB ,初始化并创建一个数据表和一个 Index。加密 DB 会在此时初始化密钥。
  • Insert Transaction: 打开事务,重复执行 INSERT 19,000 次,提交事务。
  • Insert Separated: 不使用事务,重复执行 INSERT 1,000 次。
  • Insert Rollback: 打开事务,重复执行 INSERT 1,000 次,回滚事务。
  • Update One SQL: 执行 UPDATE 语句,一次修改 10,000 条记录。
  • Update Transaction: 打开事务,重复执行 UPDATE 10,000 次,每次修改一条记录,提交事务。
  • Update Separated: 不使用事务,重复执行 UPDATE 1,000 次,每次修改一条记录。
  • Query One: 使用 SELECT 语句每次查询一条记录,重复执行 10,000 次。
  • Query Fill: 使用 SELECT 语句一次性查询 10,000 条记录,遍历 Cursor 读出所有记录。
  • Delete One SQL: 执行 DELETE 语句,一次性删除 5,000 条记录。
  • Delete Transaction: 打开事务,重复执行 DELETE 5,000 次,每次删除一条记录,提交事务。
  • Delete Separated: 不使用事务,重复执行 DELETE 1,000 次,每次删除一条记录。
    以上用例分别在同一台手机上基于不同库(WCDB、Android 原生、SQLCipher Android)和不同配置(是否WAL、是否加密)多次执行,取耗时平均值,单位毫秒(程序采集的是纳秒,统计时转换为毫秒)。

  • Framework: 对应手机上的 Android 原生框架(根据手机不同有不同版本)

  • WCDB: WCDB Android
  • SQLCipher: SQLCipher Android
  • (E): 加密
  • (W): WAL 模式

Nexus 5 Android 6.0.1 (armeabi-v7a)

CreateInsert TransactionInsert SeparatedInsert RollbackUpdate One SQLUpdate Transaction
Framework7915251125594128750
Framework(W)661588173976128739
SQLCipher3417141908396121824
SQLCipher(E)38817741594894190892
WCDB3317699916104121849
WCDB(E)352181510543106150901
WCDB(W)351781162491128865
WCDB(EW)3271829184288126875
Update SeparatedQuery OneQuery FillDelete One SQLDelete TransactionDelete Separated
Framework948037983857134010784
Framework(W)17732746393443011661
SQLCipher1430742608175532718645
SQLCipher(E)14302424581512042114922
WCDB88603053325503589579
WCDB(E)931430933218141810222
WCDB(W)17042099328663431576
WCDB(EW)17782124327473981718

Nexus 5X Android 7.1.2 (arm64-v8a)

CreateInsert TransactionInsert SeparatedInsert RollbackUpdate One SQLUpdate Transaction
Framework49108171219171510
Framework(W)53111217898069497
SQLCipher28857152087573397
SQLCipher(E)3039711690072115444
WCDB28102766018880492
WCDB(E)2431093172839491546
WCDB(W)36107714917368475
WCDB(EW)212105135747685492
Update SeparatedQuery OneQuery FillDelete One SQLDelete TransactionDelete Separated
Framework88213385151462519905
Framework(W)29072337153271982962
SQLCipher1116139244415422718222
SQLCipher(E)14467413745911230717877
WCDB708418861164723418323
WCDB(E)1206519701175624812981
WCDB(W)13211081110412062579
WCDB(EW)29301015110312293108

Concurrent Test

测试多线程并发访问性能,有以下用例:

  • WWWW (transaction): 4个并发写线程,各自打开事务,插入 5,000 条记录,然后提交事务。
  • WWWW (separated): 4个并发写线程,不使用事务,插入 500 条记录。
  • WWRR (batch): 4个并发线程,2个写线程各使用单条 UPDATE 语句修改 5,000 条记录,2个读线程各一次性查询 5,000 条记录。
  • WRRR: 4个并发线程,3个读线程分别一次性查询 5,000 条记录和一次查询一条记录重复 5,000 次,1个写线程一次性修改 5,000 条记录。
  • RRRR: 4个并发读线程,分别一次性查询 5,000 条记录和一次查询一条记录重复 5,000 次。
    同样在不同库不同配置下跑,4个线程同时开始到全部结束计时,多次执行去平均值,单位毫秒。

Nexus 5 Android 6.0.1 (armeabi-v7a)

WWWW (transaction)WWWW (separated)WWRR (batch)WRRRRRRR
Framework19552220439336083603
Framework(W)1835366428517921850
SQLCipher22094918547739764122
SQLCipher(E)22874133754740064016
WCDB21312166649641854083
WCDB(E)21572345436837443611
WCDB(W)2090376626413911359
WCDB(EW)2198481895916851449