Как получить размер объекта в памяти в Android или тесты производительности?
Короче говоря, я хочу проверить свою реализацию клона класса android.os.Bundle с этим классом, чтобы увидеть, что лучше. Я уже знаю, что моя версия, вероятно, будет хуже, но я хочу знать,Сколько хуже. Существуют ли какие-либо инструменты для сравнения для Android, которые я могу использовать, чтобы увидеть, какой объект больше в памяти и / или требует больше времени для обработки / хранения значений?
TL; DR:
Я посмотрел на исходный код класса android.os.Bundle, и я нене нравится, как он хранит и возвращает объекты. Он просто хранит их вHashMap
а затем приводит к запрошенному объектукласс (какgetString()
или жеgetInt()
) используя ClassLoader. Я чувствую, что это или любое приведение классов к тому же нарушает безопасность типов и вносит неоднозначность на уровне программирования, что статическая типизация стремится предотвратить, не так ли?
Я хочу создать аналогичный класс контейнера данных, который нене нарушает безопасность типов и нене вводить двусмысленность. Логически простой, но явно неэффективный способ - создать карту для каждого класса, который я хочу сохранить.
То, что я решил, был одинHashMap
он содержит сопоставления индекса ключа для ассортимента списков для каждого класса, который я хочу сохранить. Например, звонок вgetString(String key)
получит целочисленный индекс, связанный с этим ключом, из карты, если он существует, а затем попытается получить объект по этому индексу в связанном.ArrayList
Единственная двусмысленность здесь будет возвращаться либоnull
(где индекс неt существует в списке для этого класса) или неправильный объект правильного класса (где сопоставленный индекс существует, но исходный объект, сохраненный с этим ключом, находится в другом списке), который действительно является программистомответственность за проверку.
Объекты этого класса - только временные контейнеры, используемые для доставки данных из одного места в другое стандартным способом. Oни'не предназначены, чтобы остаться. Oни'также не используются так же, как Bundles, хотя одна из причин, по которой я хочу создать такой унифицированный контейнер данных, состоит в том, чтобы иметь возможность легко преобразовывать вBundle
JSONObject
ContentValues
или жеCursor
и назад.
Или, может быть, реальный вопрос: действительно ли все так плохо, или я просто собираюсь приложить максимум усилий, чтобы избежать этого? Я полагаю, что хорошее программирование - это единственный способ избежать двусмысленности в любом случае.
Обновить:
Похоже, Bundle использует Classloader только когдаs распаковывает себя из Parcel, но при каждом вызове put () он вызывает unparcel (). При извлечении он просто приводит к типу, который возвращает метод, внутри блока try-catch дляClassCastException
, Тот'Вероятно, самый простой способ сделать это.