Jak uzyskać rozmiar obiektu w pamięci w systemie Android lub testy wydajności?

Krótko mówiąc, chcę przetestować implementację klonowania klasy android.os.Bundle przeciwko tej klasie, aby zobaczyć, która jest lepsza. Wiem już, że moja wersja prawdopodobnie będzie gorsza, ale chcę to wiedziećile gorzej. Czy są jakieś narzędzia benchmarkingowe dla Androida, których mogę użyć, aby zobaczyć, który obiekt jest większy w pamięci i / lub zajmuje więcej czasu na przechowywanie / pobieranie wartości?

TL; DR:

Spojrzałem na kod źródłowy klasy android.os.Bundle i nie podoba mi się, jak przechowuje i zwraca obiekty. Po prostu zapisuje je wHashMap<String, Object> a następnie rzuca na klasę żądanego obiektu (jakgetString() lubgetInt()) za pomocą narzędzia ClassLoader. Uważam, że to lub jakakolwiek inna klasa rzucająca się na to, narusza bezpieczeństwo typów i wprowadza dwuznaczność na poziomie programowania, co ma zapobiegać typowaniu statycznemu, prawda?

Chcę utworzyć podobną klasę kontenerów danych, która nie narusza bezpieczeństwa typów i nie wprowadza dwuznaczności. Logicznie prosty, ale oczywiście nieefektywny sposób to posiadanie mapy dla każdej klasy, którą chcę przechowywać.

Zdecydowałem się na singielHashMap<String, Integer> który zawiera mapowania indeksu kluczy dla zestawu list dla każdej klasy, którą chcę przechowywać. Na przykład połączenie dogetString(String key) otrzyma indeks całkowitoliczbowy powiązany z tym kluczem z mapy, jeśli istnieje, a następnie spróbuj pobrać obiekt do tego indeksu w powiązanymArrayList<String>.

Jedyna niejasność tutaj powrócinull (gdzie indeks nie istnieje na Liście dla tej klasy) lub niewłaściwy obiekt odpowiedniej klasy (gdzie indeksowany indeks istnieje, ale oryginalny obiekt przechowywany z tym kluczem znajduje się na innej Liście), co jest naprawdę odpowiedzialnością programisty sprawdzić.

Obiekty tej klasy są tylko tymczasowymi pojemnikami, używanymi do wysyłania danych z jednego miejsca do drugiego w znormalizowany sposób. Nie mają się trzymać. Nie są one również używane w taki sam sposób jak pakiety, chociaż jednym z powodów, dla których chcę jednolitego kontenera danych, jest możliwość łatwej konwersji naBundle, JSONObject, ContentValues lubCursor i z powrotem.

A może prawdziwe pytanie brzmi: czy naprawdę rzuca się tak źle, czy też po prostu staram się tego uniknąć? Myślę, że dobre programowanie jest naprawdę jedynym sposobem na uniknięcie dwuznaczności w obu przypadkach.

Aktualizacja:

Wygląda na to, że Bundle używa Classloadera tylko wtedy, gdy rozpakowuje się z Parcel, ale wywołuje unparcel () z każdym wywołaniem put (). Podczas pobierania po prostu rzutuje na typ, który metoda zwraca, wewnątrz bloku try-catch dlaClassCastException. To prawdopodobnie najprostszy sposób na to.

questionAnswers(4)

yourAnswerToTheQuestion