2012-07-13 46 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本書可能會有所幫助,儘管它是針對競爭對手的操作系統編寫的。