2013-05-24 14 views
5

Ostatnio przeprowadzałem testy porównawcze, próbując znaleźć "najlepsze" frameworki serializacji dla C++, a także w Javie. Czynniki, które składają się na "najlepsze" dla mnie, to szybkość de/serializacji, a także wynikowy rozmiar serializowanego obiektu.Serializacja - różnice między C++ i Javą

Jeśli przyjrzeć się wynikom różnych frameworków w Javie, widzę, że wynikowy bajt [] jest na ogół mniejszy niż rozmiar obiektu w pamięci. Jest tak nawet w przypadku wbudowanej serializacji Java. Jeśli spojrzysz na niektóre inne oferty (protobuf itd.), Rozmiar jeszcze bardziej się zmniejszy.

Byłem bardzo zaskoczony, że gdy patrzyłem na rzeczy w rozmiarze C++ (boost, protobuf), wynikowy obiekt nie jest na ogół mniejszy (i w niektórych przypadkach większy) niż oryginalny obiekt.

Czy tu czegoś brakuje? Dlaczego dostaję sporą ilość "kompresji" za darmo w Javie, ale nie w C++?

N.B do pomiaru wielkości obiektów w Javie używam Instrumentation http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

+0

long getObjectSize (Object objectToSize) Zwraca specyficzne dla implementacji przybliżenie ilości pamięci używanej przez określony obiekt. Wynik może obejmować niektóre lub wszystkie koszty obiektu, a zatem jest przydatny do porównania w ramach implementacji, ale nie między implementacjami. Estymacja może ulec zmianie podczas jednego wywołania maszyny JVM. – user2384396

Odpowiedz

3

Czy porównać bezwzględną wielkość danych? Powiedziałbym, że Java ma więcej narzutów, więc jeśli "skompresujesz" dane do serializowanego bufora, ilość narzutów zmniejsza się o wiele więcej. W C/C++ masz prawie absolutne minimum wymagane do fizycznego rozmiaru danych, więc nie ma zbyt wiele miejsca na kompresję. I faktycznie, musisz dodać dodatkowe informacje, aby deserializować to, co może nawet spowodować wzrost.

+0

Zaktualizowałem wpis, aby pokazać, jak mierzę rozmiar obiektu w Javie. Czy masz na myśli to, że to nie serializacja jest lepsza w Javie, to fakt, że reprezentacja obiektu w pamięci jest o wiele lepsza w C++? – imrichardcole

+0

@imrichardcole, Tak, właśnie o to mi chodzi. Możesz zrzucić wyszukiwany obiekt do ciągu, a następnie porównać wyniki, aby zobaczyć, co się naprawdę dzieje, ponieważ jest to tylko moje założenie. – Devolus

1

Wielkość obiektu może być większa niż rzeczywista wielkość danych z powodu przesunięcia bitów między elementami danych.

Gdy obiekt jest serializowany, te bity odsunięcia są odrzucane, w wyniku czego pamięć obiektów szeregowych jest mniejsza.

Ponieważ java jest środowiskiem zarządzanym, będzie potrzebować więcej takich przesuniętych danych do kontrolowania pamięci i własności, dlatego ich współczynnik kompresji jest większy.

Powiązane problemy