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.

questionAnswers(4)

yourAnswerToTheQuestion