Desempenho de um armazenamento persistente

O armazenamento persistente existe no armazenamento de aplicativos. Há mais latência ao gravar no armazenamento do aplicativo do que há ao ler o que está nele. Ler o que há no armazenamento persistente é relativamente rápido, porém a confirmação é relativamente lenta.

Prática recomendada: Usar uma seleção de estrutura de dados eficiente

A seleção de estrutura de dados define a quantidade de handles de objeto e de memória flash usada por um aplicativo. A seleção de estrutura de dados imprópria pode consumir recursos essenciais sem melhorar a funcionalidade ou a experiência de usuário.

Considere as seguintes diretrizes:

  • A estrutura de dados deve ser composta pelo menor número possível de objetos, especialmente quando você usa objetos de nível superior como Vector ou Hashtable. Essas classes oferecem funcionalidade significativa, mas não são um mecanismo de armazenamento eficiente: evite utilizá-las no armazenamento persistente.
  • Sempre que possível, use primitivos em vez de objetos, porque os primitivos reduzem o número de handles de objeto que são consumidos no smartphone. Uma matriz de primitivos é um objeto e consome um handle de objeto.
  • Stringsão tão eficientes quanto as matrizes de byte. Um objeto String consome apenas um handle de objeto e seria equivalente ao seu aplicativo armazenar todos os caracteres como um byte. Em outras palavras, o valor de cada caractere é menor ou igual ao valor decimal de 255. Se o seu aplicativo não puder armazenar caracteres como um byte, você poderá armazenar os caracteres como uma String, que é equivalente a armazenar uma matriz char.

Prática recomendada: Como preservar handles de objeto

Um dos erros mais comuns que os desenvolvedores de aplicativos encontram é o esgotamento de handles de objeto persistente. A quantidade de espaço de armazenamento de aplicativo no smartphone determina a quantidade fixa de handles de objeto persistente disponíveis no sistema. Dependendo da seleção da estrutura de dados, os registros armazenados podem esgotar facilmente os handles de objeto persistente. Um objeto persistente consome um handle de objeto persistente e um handle de objeto. Um objeto transitório consome apenas um handle de objeto.

Por exemplo, um registro que contém dez campos String, que representam itens como um nome, um número de telefone e um endereço, consome 11 handles de objeto persistente, um para o objeto de registro e um para cada String. Se um aplicativo persistir em 3.000 registros, o aplicativo consumirá 33.000 handles de objeto persistente, excedendo assim a quantidade de handles de objeto persistente disponível em um smartphone com 16 MB de memória flash.

Você pode usar a classe net.rim.device.api.system.ObjectGroup para consolidar os handles de objeto para um objeto em um grupo.. Usando o exemplo do parágrafo anterior, se você agrupar o registro, ele consumirá um handle de objeto persistente em vez de 11. Os handles de objetos dos campos String são consolidados no handle de objeto do registro.

Quando você consolida handles de objeto em um grupo, o handle de objeto é somente leitura. Você deve desagrupar o objeto antes de alterá-lo. Após concluir as alterações, agrupe-o novamente. Se você tentar alterar um objeto agrupado sem antes desagrupá-lo, a exceção ObjectGroupReadOnlyException será gerada.

Desagrupar um objeto causa impacto no desempenho. O sistema cria uma cópia do objeto agrupado e aloca handles para cada um dos objetos dentro desse grupo. Por isso, os objetos devem ser desagrupados somente quando necessário.

É possível programar a confirmação de armazenamento persistente para que ocorra durante a coleta de lixo sem um commit() explícito, de forma que o agrupamento de objetos sempre ocorra antes das chamadas a setContents() ou commit(). Para obter mais informações sobre agrupamento de objetos, consulte net.rim.device.api.system.ObjectGroup.

Limpeza de objetos persistentes

Quando um aplicativo é removido de um smartphone BlackBerry, os objetos persistentes que são definidos no aplicativo são excluídos automaticamente. Isso porque cada objeto persistente tem um tipo de classe que é definido no aplicativo. Quando o aplicativo é removido, o tipo de classe é excluído, de forma que os objetos persistentes são excluídos.

Para assegurar a limpeza do armazenamento persistente utilizado, você sempre deve armazenar as instâncias de suas próprias classes ou suas próprias extensões de classes fornecidas.

Para excluir dados individuais, trate os dados como objetos normais e remova as referências a eles. Uma operação de coleta de lixo remove os dados.


Estas informações foram úteis? Gostaríamos de receber seus comentários.