2015-11-11 4 views
8

Mam na myśli wykorzystanie Realm.io jako mojego ORM w aplikacji produkcyjnej.Czy pola odczytu obiektu Realm są wolniejsze niż obiekty Java?

Jak rozumiem z dokumentów Obiekty RealmResults są przechowywane w BackendStore (dysku) zamiast w pamięci RAM, ponieważ RealmResult jest tylko proxy rzeczywistych obiektów zapisanych w bazie danych.

Moje pytanie brzmi, czy odczytanie pól obiektu RealmObject będzie równie szybkie, jak czytanie go z normalnego obiektu Java, biorąc pod uwagę, że obiekty Java są przechowywane w pamięci RAM. Mam wiele odczytów w mojej aplikacji i obawiam się, że wpłynie to na szybkość reakcji.

Odpowiedz

3

To zależy od tego, z czym porównasz. RealmResults jest wynikiem zapytania, a Realm nie kopiuje obiektów - w przeciwieństwie do tradycyjnej ORM. Realm będzie pobierał obiekt tylko wtedy, gdy jest potrzebny, a typowa ORM skopiuje obiekty do pamięci. Kopiowanie obiektów z SQLite do zwykłych obiektów Java jest związane wydajnością I/O.

Dostęp do RealmObject może być wolniejszy niż uzyskanie dostępu do zwykłego obiektu Java. Ale zwykły obiekt Java nie jest trwały. Realm oferuje opcję w pamięci, która jest bardziej bezpośrednim porównaniem ze zwykłymi obiektami Java. Dziedziny w pamięci mają właściwość jako obiekty zwykłe: tracisz dane po zamknięciu aplikacji.

Tak więc, jeśli spędzasz dużo czasu na kopiowaniu obiektów z SQLite, aby mieć szybkie obiekty w pamięci, może to skończyć się wolniej.

+2

Tak więc, aby to naprawić, za każdym razem, gdy używam gettera w obiekcie RealmObject, w rzeczywistości jest on pobierany z bazy danych. Czy nie ma tu warstwy pamięci podręcznej? W przeciwnym razie, o co chodzi w tym, że szybko dostajesz zapytanie, jeśli powoli dostajesz prawdziwy obiekt? – orelzion

+0

Każdy obiekt Realm jest wspierany przez plik Realm. Wewnętrznie, Realm jest mapowaniem pamięci do pliku Realm, co faktycznie przyspiesza działanie, ponieważ nie musisz deserializować obiektu. – geisshirt