作为Android预置的数据库模块,对SQLite的深入理解是很有必要的,能够从中找到一些优化的方向。

这里对SQLite的性能和内存进行了一些測试分析。对照了不同操作的运行性能和内存占用的情况,粗略地列在这里算是作个小结。

1. 基本架构

先了解一下SQLite主要架构 (详见《The Definitive Guide to SQLite》), 须要关注的是Compiler和Backend两个模块。正由于有一个虚拟机的存在。所以才有了Compiled Statement的价值,由于它能够降低前置的编译时间,直接到VDBE上运行。而Backend端的Pager,则是关键数据管理者。真正决定者数据操作的性能,以及内存占用。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

这里不再赘述,具体的内容还是阅读有关SQLite介绍的资料。

2. 性能

这次測试基于Sumsung i9103和Google Nexus S1进行。

使用Python脚本及adb指令通过Intent操作Android应用进行数据库操作。

i. SELECT操作

首先观察到SELECT在不同记录数下的峰值分布,可见总体上有上升的趋势。

正如SQLite官方说的它并不适合存储大量数据,一定要控制当中的记录数量。

另外SELECT操作性能也取决于查询的栏位个数,而@行云进一步确认和返回栏位的内容大小有关。也就是栏位的内容和多少也须要权衡。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

ii. 关于事务

事务是提高SQLite操作性能的一个重要技术。特别是SQLite实现了WAL。使得事务与SELECT不会相互排斥,大大提高了应用的性能。

參见附2。

以下是未使用事务时,三类操作的平均值:

使用了事务后,各个操作的性能大幅下降。

可是问题是事务提交的时间会变长,这个时间一是须要形成新的峰值,另外也要平分到各个操作来看:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

所以不能贪多,事务还是要及时提交。另外注意, 尽管Compiled Statement有利于性能表现,但还不如使用事务的效果来得直接。

iii. 不同机型的操作性能

先看SELECT操作的平均值在两种机型上的表现, 能够看到i9103上的波动性比較大。而Nexsus S1则一直保持稳定:

散点图,能够观察到时间分布情况:

再看另外三个操作的表现(上下两部分false和true分别表示为未使用事务和使用事务的情况):

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

运用WAL能够大幅提升性能,只是它也有一个副作用。

它会导致数据查询须要进行两次,能够理解为一次在db文件。一次在wal文件。具体原因參见<<The Definitive Guide to SQLite>>最后一章。WAL是满1000Pages时才会合并到主数据库里。这个时机称为checking point, 能够进行配置。按默认的Page Size:1024计算,也就是当WAL文件接近1M时,进行检查。

假设没有活动的事务使用这些pages,就会提交。

而WAL的大小。对SELECT的影响表现不同。

以下是WAL对查询性能峰值影响的測试数据(i9103上測试)。图中的true,false表示是否有WAL文件存在。

*总体的平均值相差在1ms,但峰值的才是真正值得注意的。

为了避免WAL过大。能够选择调用SQLiteDatabase::disableWriteAheadLogging()强制合并到主数据库文件。这个调用会异步在SQLite内部运行。不会明显堵塞用户的线程。

*另外,SQLiteDatabase::query()仅仅是对SQLiteDatabase::rawQuery()的封装,多了一个字串组装的过程。反而不如直接使用SQLiteDatabase::rawQuery()。

3. 内存

SQLite以Page为单位存储数据,默认一个Page有1024字节,然后通过B- Tree组织起来(Table使用B+ Tree组织):

Lookaside则是SQLite应用的内存管理的技术,优化了内存的使用效率。主要思想是先分配一整块内存, 分成若干个slots。然后SQLite再按需使用。

这和很多小内存分配器的思想是一样的。详见附1。

再解释一下Page Cache Overflow, 主要是在一个Page中的记录的数据无法刚好放在一个Page内,还要使用额外的还有一个Page空间。 这就是Overflow Page。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ya3lDaGVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

Android还有个万能dumpsys, 使用dumpsys meminfo能够查看到一个进程的SQLite使用的内存信息。如:

SQL

                heap:      265          MEMORY_USED:      265

  PAGECACHE_OVERFLOW:       73          MALLOC_SIZE:       46

 

 DATABASES

      pgsz     dbsz   Lookaside(b)          cache  Dbname

         4       60             17      199/114/1  webviewCache.db

                                          1/541/1  (pooled # 1) webviewCache.db

. cache的三个值各自是:

Page Cache的命中次数、未命中次数,以及Page Cache个数。能够在Android源代码中的SQLiteDebug.java以及ActivityThread.java找到细节的内容。

. page size, db size的单位是KBytes, Lookaside(b)是指使用多少个Lookaside的slots。

. 对于Heap和Overflow Pages,SQLiteDatabase的内存回收可能没有那么及时,能够调用SQLiteDatabase::releaseMemory()进行主动释放。

*使用SQLite的PRAGMA能够直接获取一些通过SQLiteDatabase获取不到信息。当然假设SQLite不支持。也会抛异常出来,详见附4。

转载请注明出处: http://blog.csdn.net/horkychen  SQLite是一个很精致的系统,很值得研究学习。

參考

1. SQLite Dynamic Memory Allocation

2. Write-Ahead Logging 或 SQLite的WAL机制

3. The Definitive Guide to SQLite( SQLite权威指南, 两处关于架构和Overflow page的截图来于此书.)

4. PRAGMA Statement

5. 官方文档

6. NEC关于Android系统上存储器操作性能的研究报告 (里面有讲述SQLite由于其随机性訪问的机制而在不同文件系统上的性能差异)

7. Android开发中的SQLite优化

Android SQLite性能分析的更多相关文章

  1. Android APP性能分析方法及工具

    近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...

  2. Oprofile分析(android oprofile性能分析)

    一.内核支持: make menuconfig 1.评测菜单中启用 Oprofile ,在 .config 文件中设置?CONFIG_PROFILING=y?和?CONFIG_OPROFILE=y 2 ...

  3. 正确使用Android性能分析工具——TraceView

    http://blog.jobbole.com/78995/     首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - Ja ...

  4. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

  5. Android性能分析之TraceView的使用

    TraceView简介 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,最终它会产 ...

  6. android 性能分析、优化

    .主要介绍了一些分析工具,比如GT.ITest等http://www.jianshu.com/p/8b77d394b2a6 .详细介绍啦android平台常见性能优化工具http://blog.csd ...

  7. Android性能分析工具介绍

    1. Android系统性能调优工具介绍 http://blog.csdn.net/innost/article/details/9008691 TraceviewSystraceOprofile 2 ...

  8. Cocos2d-x性能分析-Android版本之Gprof

    在 iOS 平台下我们可以用 Xcode 自带的 Profile 工具来测试我们程序的性能,Android 平台使用的 gprof 这里整理了一下具体的cocos2dx 使用gprof进行性能分析的具 ...

  9. Android绘制优化(一)绘制性能分析

    前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...

随机推荐

  1. java EE技术体系——CLF平台API开发注意事项(4)——API生命周期治理简单说明

    文档说明 截止日期:20170905,作者:何红霞,联系方式:QQ1028335395.邮箱:hehongxia626@163.com 综述 有幸加入到javaEE技术体系的研究与开发,也得益于大家的 ...

  2. HDU——1789Doing Homework again(贪心)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  4. bzoj1306: [CQOI2009]match循环赛(模拟爆搜)

    Input第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分.Output输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表.Sample Input 6 5 6 ...

  5. [POJ2417]Discrete Logging(指数级同余方程)

    Discrete Logging Given a prime P, 2 <= P < 2 31, an integer B, 2 <= B < P, and an intege ...

  6. poj 2492 A Bug's Life 二分图染色 || 种类并查集

    题目链接 题意 有一种\(bug\),所有的交往只在异性间发生.现给出所有的交往列表,问是否有可疑的\(bug\)(进行同性交往). 思路 法一:种类并查集 参考:https://www.2cto.c ...

  7. EXT.JS6中的model,store,proxy的一些用法

    //one-to-one Ext.define('Address', { extend: 'Ext.data.Model', fields: [ 'address', 'city', 'state', ...

  8. CDN或负载均衡或WAF,后端服务器获取真实IP

    问题起因: 1. 后端PHP的$_SERVER["REMOTE_ADDR"]个别服务器获取不到真实IP 2. iptables 和 悬镜 等工具,设置IP黑名单不起作用 简单点说, ...

  9. 缓存区溢出漏洞工具Doona

    缓存区溢出漏洞工具Doona   Doona是缓存区溢出漏洞工具BED的分支.它在BED的基础上,增加了更多插件,如nttp.proxy.rtsp.tftp等.同时,它对各个插件扩充了攻击载荷,这里也 ...

  10. 证书锁定Certificate Pinning技术

    证书锁定Certificate Pinning技术   在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信.攻击机以自己的证书替代服务器发给客户端的证书.通常,客户端不会验证该证书,直接接受该证 ...