영구 저장소의 성능

영구 저장소는 프로그램 저장 공간에 있습니다. 프로그램 저장 공간은 읽을 때보다 쓸 때 대기 시간이 더 깁니다. 영구 저장소에서 읽을 때는 속도가 비교적 빠르지만 커밋은 상대적으로 느립니다.

모범 사례: 효율적인 데이터 구조 선택 사용

데이터 구조 선택에 따라 프로그램이 소모하는 객체 핸들 수 및 플래시 메모리 양이 결정됩니다. 부적절한 데이터 구조를 선택하면 기능이나 사용자 환경을 개선하지 않고 주요 리소스를 소모하게 될 수 있습니다.

다음 지침을 고려해 보십시오.

  • 데이터 구조는 가능한 최소 객체 수로 구성되어야 합니다. Vector 또는 Hashtable 같은 높은 수준의 객체를 사용하는 경우에는 더욱 그렇습니다. 이러한 클래스는 중요한 기능을 제공하지만 효율적인 저장소 메커니즘은 아닙니다. 따라서 가능한 경우 영구 저장소에는 사용하지 않도록 합니다.
  • 원시 요소는 스마트폰에서 소모되는 객체 핸들 수를 줄여주므로 가능한 경우 객체 대신 원시 요소를 사용하십시오. 원시 요소 배열은 하나의 객체를 이루고 객체 핸들을 하나만 소모합니다.
  • String 객체는 바이트 배열만큼 효율적입니다. 한 String 객체는 객체 핸들을 하나만 소모하고 프로그램이 모든 문자를 한 바이트로 저장하는 경우와 같습니다. 즉, 각 문자의 값은 십진수 255보다 작거나 같습니다. 프로그램이 문자를 한 바이트로 저장할 수 없는 경우 문자를 String으로 저장할 수 있습니다(char 배열을 저장하는 것과 같음).

모범 사례: 객체 핸들 절약

프로그램 개발자가 경험하는 가장 일반적인 오류 중 하나는 영구 객체 핸들의 소진 문제입니다. 스마트폰의 프로그램 저장 공간의 양은 시스템에서 사용할 수 있는 고정된 영구 객체 핸들 수를 결정합니다. 데이터 구조 선택에 따라 저장된 레코드는 영구 객체 핸들의 수를 빠르게 소진할 수 있습니다. 하나의 영구 객체(Persistent object)는 하나의 영구 객체 핸들과 하나의 객체 핸들을 소모합니다. 하나의 전이 객체(Transient object)는 하나의 객체 핸들만을 소모합니다.

예를 들어 이름, 전화 번호 및 주소와 같은 항목을 나타내는 10개의 String 필드를 포함하는 레코드는 레코드 객체에 하나와 각 String에 하나씩 11개의 영구 객체 핸들을 소모합니다. 어느 프로그램이 3,000개의 레코드를 사용한다면 이 프로그램은 33,000개의 영구 객체 핸들을 소모하게 되어, 16MB 플래시 메모리를 가진 스마트폰에서 사용 가능한 영구 객체 핸들의 수를 초과하게 됩니다.

net.rim.device.api.system.ObjectGroup 클래스를 사용하여 객체의 객체 핸들을 하나의 그룹으로 통합할 수 있습니다. 앞 단락의 예를 사용하여 레코드를 그룹화하는 경우 레코드는 11개 대신 1개의 영구 객체 핸들을 소모합니다. String 필드의 객체 핸들은 레코드 객체 핸들로 통합됩니다.

객체 핸들을 하나의 그룹으로 통합할 때 객체 핸들은 읽기 전용이 됩니다. 객체를 변경하려면 객체의 그룹을 먼저 해제해야 합니다. 변경을 완료한 후에는 객체를 다시 그룹화해야 합니다. 그룹화된 객체를 그룹 해제하지 않은 채 변경을 시도하면 ObjectGroupReadOnlyException이 발생합니다.

객체의 그룹을 해제하면 성능에 영향을 줍니다. 시스템은 그룹화된 객체의 사본을 만들고 해당 그룹 내의 각 객체에 핸들을 할당합니다. 따라서, 객체는 반드시 필요한 경우에만 그룹을 해제해야 합니다.

가비지를 수집하는 동안 명시적 commit() 없이 영구 저장소에 대한 커밋이 발생할 수 있습니다. 그러므로 setContents() 또는 commit()을 호출하기 전에 항상 객체를 그룹화해야 합니다. 객체 그룹화에 대한 자세한 내용은 net.rim.device.api.system.ObjectGroup을 참조하십시오.

영구 객체의 정리

BlackBerry 스마트폰에서 프로그램을 제거하면 프로그램에서 정의된 영구 객체가 자동으로 삭제됩니다. 이는 각 영구 객체가 프로그램에서 정의된 클래스 유형을 가지기 때문입니다. 프로그램이 제거되면 클래스 유형이 삭제되고, 따라서 영구 객체도 삭제됩니다.

사용 중인 영구 저장소를 정리하려면 항상 사용자의 고유한 클래스 인스턴스 또는 제공된 클래스의 고유 확장자를 저장해야 합니다.

개별 데이터를 삭제하려면 데이터를 일반 객체로 처리하고 해당 데이터에 대한 참조를 제거합니다. 가비지 수집 작업을 수행하면 데이터가 제거됩니다.


이 정보가 도움이 되었습니까? 의견을 보내 주십시오.