• Android Benchmark 运行方法
  • 添加自己的 Benchmark Case
  • Single-threaded Test
    • Nexus 5 Android 6.0.1 (armeabi-v7a)
    • Nexus 5X Android 7.1.2 (arm64-v8a)
  • Concurrent Test
    • Nexus 5 Android 6.0.1 (armeabi-v7a)

    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