Como obter o tamanho da memória de um objeto no Android ou benchmarks de desempenho?
Resumindo, quero testar a implementação do clone da classe android.os.Bundle contra essa classe para ver qual é a melhor. Eu já sei que minha versão provavelmente será pior, mas eu quero saberquantos pior. Existe alguma ferramenta de benchmarking disponível para Android que eu possa usar para ver qual objeto é maior na memória e / ou que leva mais tempo de processamento para armazenar / recuperar valores?
TL; DR:
Eu olhei para o código-fonte da classe android.os.Bundle e não gosto de como ele armazena e retorna objetos. Apenas os armazena em umHashMap<String, Object>
e então lança para a classe do objeto requisitado (comogetString()
ougetInt()
) usando um ClassLoader. Eu sinto que isso, ou qualquer tipo de elenco de classe, viola a segurança de tipos e introduz ambigüidade no nível de programação, que é o que a tipagem estática visa prevenir, não é?
Desejo criar uma classe de contêiner de dados semelhante que não viole a segurança de tipos e não introduza ambigüidade. A maneira logicamente simples, mas obviamente ineficiente, seria ter um Mapa para cada classe que eu queira armazenar.
O que eu decidi foi um singleHashMap<String, Integer>
que contém mapeamentos de índice-chave para uma variedade de Listas para cada classe que eu quero armazenar. Por exemplo, uma chamada paragetString(String key)
irá obter o índice inteiro associado a essa chave do mapa, se existir e, em seguida, tentar obter o objeto nesse índice no mapa associado.ArrayList<String>
.
A única ambigüidade aqui seria retornarnull
(onde o índice não existe na lista para essa classe) ou o objeto errado da classe da direita (onde o índice mapeado existe, mas o objeto original armazenado com essa chave está em outra lista), que é realmente responsabilidade do programador verificar se há.
Objetos dessa classe são apenas contêineres temporários, usados para enviar dados de um local para outro de maneira padronizada. Eles não estão destinados a ficar por aqui. Eles também não são usados da mesma maneira que Bundles, embora parte da razão pela qual eu queira um contêiner de dados unificado como esse seja poder converter facilmenteBundle
, JSONObject
, ContentValues
ouCursor
e volta.
Ou talvez a verdadeira questão seja: é realmente tão ruim, ou estou indo para esforços extremos para evitá-lo? Eu acho que uma boa programação é realmente a única maneira de evitar a ambigüidade em ambos os casos.
Atualizar:
Parece que o Bundle só usa o Classloader quando está descompactando a si mesmo de um Parcel, mas faz uma chamada para unparcel () com cada chamada put (). Ao recuperá-lo, simplesmente é lançado para o tipo que o método retorna, dentro de um bloco try-catch paraClassCastException
. Essa é provavelmente a maneira mais simples de fazer isso.