2012-07-13 47 views
3

我正在测量打开和关闭数据库以及对其执行查询和插入的方法的执行时间。对于这四个操作的每一个我的相关声明这样执行之前和之后基本上得到了时间:Android数据库操作执行时间的变化

for(int i = 0; i < 500; i++) { 
    startTime = System.nanoTime(); 
    long insertResult = db.insert(tableName, null, contentValues); 
    endTime = System.nanoTime(); 
    if(insertResult > -1) { 
     generateNoteOnSD(fileName, (endTime - startTime)); 
    } 
} 

在插入的情况下:

  • 在最小执行时间样品为13 ms(毫秒)
  • 样品中的最大执行时间是537毫秒
  • 一点点设置(259“插入”从500执行)的结果的50%以上是15至20毫秒之间。
  • 20ms以上的值具有非常低的频率(1,2或3)。

有人请给我一个想法/方向如何执行这种类型的操作系统?我并不真正了解如何执行写入操作来存储存储,以及它取决于哪些因素。我想知道这一点,试图解释上述测量(为什么相同操作的执行时间的变化)。

任何帮助非常感谢。

奥克塔维奥

回答

2

我会认为这是一个普通的表,而不是一个临时表。

让我们从这里最大的性能开始吧。

默认情况下,每个这样的插入开始和结束一个新的事务。如果你想大大加快这,应用

db.beginTransaction(); 

你的循环之前,和

db.setTransactionSuccessful(); 
db.endTransaction; 

在循环之后。这将把所有的插入放在同一个事务中。请务必测量db.endTransaction的时间,其中花费的总时间将会移动。当您没有手动调用这些操作时,每个db.insert都隐式地包含在这些操作中,并且这被称为隐式事务

虽然事务协议本身很复杂,并且考虑到一些性能差异,但细粒度的事务处理会导致硬件速度的差异。事务需要持久,所以它们需要写入到闪存(写入甚至比读取要慢,并且每个事务需要多次写入)。相比之下,“一次长事务”写入易失性内存,即使数据需要在提交期间也进入闪存,您只需要一小部分写入。如果你的行很窄,这个效果就更清楚了,因为更多的行可以放入闪存块并且一次写入。

就读,交易在这里扮演的角色较少。这很容易。如果您的应用程序在易失性RAM中很热,所有数据都会从那里传出。如果不是,则数据从闪存中传出。

数据中的高峰可能归因于不相关的后台进程与数据库竞争。这只会在这些应用程序进行密集计算时才会发生。如果其中一些进程访问相同的数据库,则可能会遇到锁定争用;即使这些进程正在等待其他事情,这也是可能的。这也可以解释为什么他们的分布非常不规范。这不是唯一的可能性。

有关SQLite中使用的算法的一般概述,查看this本书可能会有所帮助,尽管它是针对竞争对手的操作系统编写的。