Android SQLite性能分析

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

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

1. 基本架构

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

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

2. 性能

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

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

i. SELECT操作

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

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

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

ii. 关于事务

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

參见附2。

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

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

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

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

iii. 不同机型的操作性能

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

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

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

运用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。

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优化

时间: 2024-10-12 13:43:06

Android SQLite性能分析的相关文章

Android APP性能分析方法及工具

近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借鉴.英文好的读者可读原文(链接:http://blog.udinic.com/2015/09/15/speed-up-your-app). 1.作者的规则 作者每次着手处理或寻找性能问题时,遵循下列规则: 时常检测 在更新APP前后,用测试工具软件多检测几次APP性能,可快速得到测试数据.这些数字是不会说谎的

Android TraceView 最权威的性能分析工具

TraceView是什么 Traceview是android平台配备一个很好的性能分析的工具.它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method. Traceview的作用 查看跟踪代码的执行时间,分析哪些是耗时操作 可以用于跟踪方法的调用,尤其是Android Framework层的方法调用关系 如何使用TraceView 使用TraceView主要有两种方式: 最简单的方式就是直接打开DDMS,选择一个进程,然后按上面的"Start Method Profili

正确使用Android性能分析工具&mdash;&mdash;TraceView

前面唠叨 最近公司app中有些列表在滑动的时候会有卡顿现象,我就开始着手解决这些问题,解决问题之前首先要分析列表滑动的性能瓶颈在什么地方.因为之前不会正确使用TraceView这个工具,主要是看不懂TraceView界面下方数据指标的值代表什么意思-以前我用StopWatch类来分析性能,现在觉得弱爆了-不过有些地方StopWatch工具类还是很简单好用的~ 网上可以找了很多博客来介绍这个工具的使用方法,很多都是讲解了一些一些就会的方法,讲一个大概,包括StackOverFlow上我也没有找到很

如何使用Android中TraceView性能分析工具

现来看一下整个界面的图,整个界面包括上下两部分,上面是你测试的进程中每个线程的执行情况,每个线程占一行:下面是每个方法执行的各个指标的值 上面一部分是你测试进程的中每个线程运行的时间线,下图中可以可以看到,主要只有一个main线程在执行,因为我滑动了一下列表,main线程(UI线程)正在进行绘制View呢~ 附相关视频教程Android应用开发视频教程 然后我点击了序号为133的一个方法io.bxbxbai.android.examples.activity.ExpandableLayoutMa

Android 性能优化 五 性能分析工具dumpsys的使用

Android提供的dumpsys工具可以用于查看感兴趣的系统服务信息与状态,手机连接电脑后可以直接命令行执行adb shell dumpsys 查看所有支持的Service但是这样输出的太多,可以通过dumpsys | grep "DUMP OF SERVICE" 仅显示主要的Service的信息 一.列出dumpsys所有支持命令 > adb shell $ dumpsys | grep "DUMP OF SERVICE" 以下是在我个人三星S3手机上的输

android 性能分析、优化

1.主要介绍了一些分析工具,比如GT.ITest等http://www.jianshu.com/p/8b77d394b2a6 2.详细介绍啦android平台常见性能优化工具http://blog.csdn.net/yanbober/article/details/48394201例如:UI方面:android系统提供的GPU OverDraw 过度绘制工具:GPU呈现模式分析等. Lint快速分析不合理懂UI布局:HierarchyViewer 具体分析View布局.内存方面:介绍了Memor

Android性能分析工具介绍

1. Android系统性能调优工具介绍 http://blog.csdn.net/innost/article/details/9008691 TraceviewSystraceOprofile 2. [腾讯开源]Android性能测试工具APT使用指南 http://www.csdn.net/article/2014-04-23/2819366-tencent-APT-open-source-tool-guide APT源码地址:https://code.csdn.net/Tencent/a

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

前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CPU,因此在开发Android应用程序时也不可能无限制的使用CPU和内存,如果对CPU和内存使用不当也会造成应用的卡顿和内存溢出等问题.因此,应用的性能优化对于开发人员有着更高的要求.Android性能优化分为很多种,比较常用的有绘制优化.内存优化.耗电优化和稳定性优化等,这个系列我们就来学习性能优化

Android基础性能检测与分析

本文内容:基于Android基础性能检测与分析 版权声明:本文为原创文章,未经允许不得转载 博客地址:http://blog.csdn.net/kevindgk 前言 UI性能分析 应用启动时间计算以及程序启动白屏问题 内存分析 内存优化原则 内存区分 内存分析 内存泄露工具MAT 内存泄露工具LeakCanary 耗电量分析 性能检测和分析工具 1 高通性能分析器 - TrepnProfiler 2 高通调试器 - TuneUpKit 3 阿里-易测 云测平台 引用 联系方式 前言 最近一段时