2012-07-13 2 views
3

나는 데이터베이스를 열고 닫는 메소드의 실행 시간을 측정 할뿐만 아니라 쿼리와 삽입을 수행합니다. 이 네 가지 작업 각각에 대해 나는 기본적으로 같은 관련 문 실행 전후에 시간을 얻을 :안드로이드 데이터베이스 작업에 대한 실행 시간의 변화

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)); 
    } 
} 

을 삽입의 경우 :

  • 의 최소 실행 시간 샘플은 13ms (밀리 초)
  • 샘플의 최대 실행 시간은 537ms입니다.
  • 결과 세트의 50 % 이상 (500에서 259 '삽입'실행)은 15-20 ms입니다 .
  • 20ms 이상의 값은 매우 낮은 빈도 (1, 2 또는 3)입니다.

누군가이 아이디어가 시스템에서 이러한 유형의 작업을 수행하는 방법에 대한 지침을 줄 수 있습니까? 필자는 스토리지를 지속시키기위한 쓰기 작업이 어떻게 이루어지고 어떤 요인에 의존하는지에 대해서는 실제로 알지 못합니다. 위의 측정 값을 설명하려고 시도하는 것을 알고 싶습니다 (같은 작업의 실행 시간이 왜 다른지).

도움이 매우 감사합니다.

옥타비오

답변

2

나는이 일반 테이블이 아닌 임시 테이블이라고 가정합니다.

여기서 가장 큰 성능의 돼지로 시작하겠습니다.

기본적으로 이러한 각 삽입은 새 트랜잭션을 시작하고 종료합니다. 당신이 대단히이 속도를하려면, 루프 후

db.beginTransaction(); 
루프 전에

db.setTransactionSuccessful(); 
db.endTransaction; 

을 적용합니다. 이렇게하면 모든 삽입을 동일한 트랜잭션에 넣을 수 있습니다. db.endTransaction 시간을 측정해야합니다.이 시간의 일부는 이동했을 것입니다. 이러한 작업을 수동으로 호출하지 않았 으면 각 db.insert이 암시 적으로 래핑되었으므로 암시 적 트랜잭션이라고합니다.

트랜잭션 프로토콜 자체가 복잡하고 성능 차이의 일부를 차지하지만 미세 트랜잭션의 경우 하드웨어 속도에 차이가 있습니다. 트랜잭션은 내구성이 있어야하므로 은 플래시 메모리에을 씁니다 (쓰기는 읽기보다 속도가 더 빠르며 트랜잭션 당 두 개 이상의 쓰기가 필요합니다). 대조적으로, "하나의 긴 거래"는 휘발성 메모리에 기록하며, 데이터가 커밋 중에 플래시로 이동해야하는 경우에도 일부만 쓸 수 있습니다. 행이 좁은 경우 더 많은 행이 플래시 메모리 블록에 들어가고 한 번에 쓰여 지므로이 효과는 더 명확합니다.

여기까지 읽으면 트랜잭션이 덜 중요한 역할을합니다. 쉽습니다. 응용 프로그램이 휘발성 RAM에서 뜨거우면 모든 데이터가 거기에서 이동합니다. 그렇지 않으면 플래시에서 데이터가 이동합니다.

데이터의 스파이크는 관련없는 백그라운드 프로세스가 데이터베이스와 경쟁 할 가능성이 있습니다. 이러한 응용 프로그램이 집중적 인 계산을 수행 할 때만 발생합니다. 이러한 프로세스 중 일부가 동일한 데이터베이스에 액세스하는 경우 잠금 잠금 경합이 발생할 수 있습니다. 이러한 프로세스가 다른 것을 기다리는 경우에도 가능합니다. 이것은 또한 그들의 분포가 왜 불규칙적인지 설명 할 수 있습니다. 이것이 유일한 가능성은 아닙니다.

SQLite에서 사용되는 알고리즘에 대한 일반적인 개요는 경쟁 운영 체제 용으로 작성되었지만 this 책을 보면 유용 할 수 있습니다.