2010-10-11 16 views

Odpowiedz

8

Serializacja binarna jest bardziej wydajna, ponieważ bezpośrednio zapisuje dane surowe i format potrzeb XML, i analizuje dane, aby wygenerować prawidłową strukturę XML, dodatkowo w zależności od tego, jakie dane mają twoje obiekty, XML może mieć dużo nadmiarowych danych .

11

Rozważmy szeregowania dwukrotnie na przykład:

  • binarnym serializacji: pisanie 8 bajtów od adresu pamięci do strumienia

  • binarny deserializacji: czytanie samo 8 bajtów

  • xml serializacji: pisanie tag, konwersja do tekstu, zapisywanie znacznika zamykającego - prawie trzykrotność operacji we/wy i 1000x więcej wykorzystania procesora

  • deserializacja xml: odczytywanie/sprawdzanie znacznika, ciąg do czytania, parsowanie go do numeru, odczytywanie/sprawdzanie poprawności znacznika zamykającego. trochę więcej napowietrznych na I/O, a niektóre bardziej dla CPU

+2

Można również wspomnieć o zarządzaniu pamięcią dla obiektów łańcuchowych zwykle tworzonych podczas serializacji lub deserializacji formatów tekstowych. Może to wypchnąć rzeczy z pamięci podręcznej procesora lub spowodować, że algorytmy zbierania śmieci zaczną kopać lub thrashować. –

8

Faktycznie, jak wszystkie rzeczy - To zależy od danych, a serializer.

Często (choć może nierozsądnie) ludzie mają na myśli BinaryFormatter dla „binarny”, ale to ma wiele słabości:

  • w dodaje wiele typu metadanych (które wszystko odbywa spacja)
  • domyślnie zawiera nazwy (pole, które może być rozwlekły, zwłaszcza automatycznie realizowane właściwości)

Odwrotnie, XML zwykle ma ogólne koszty, takie jak:

  • znaczniki dodawanie miejsca i IO
  • Potrzeba analizowania znaczniki (co jest niezwykle kosztowne)
  • wiele kodowanie tekstu/dekodowania

oczywiście xml łatwo prasować dodanie CPU, lecz niezwykle zmniejszenie przepustowości.

Ale to nie znaczy, że jeden jest szybszy; Chciałbym odesłać Cię do przykładowych statystyk: from here (z pełnym źródłem), do którego dodałem adnotację do bazy serializera (binarny, xml, tekst, itp.). Spójrz w szczególności na pierwsze dwa wyniki; wygląda jak XmlSerializer pod każdą wartością, a jednocześnie zachowuje zalety wielu platform. Oczywiście, protobuf następnie atuty XmlSerializer; p

Te numery wiążą się całkiem dobrze z ServiceStack's benchmarks, here.

BinaryFormatter *** binary 
Length: 1314 
Serialize: 6746 
Deserialize: 6268 

XmlSerializer *** xml 
Length: 1049 
Serialize: 3282 
Deserialize: 5132 

DataContractSerializer *** xml 
Length: 911 
Serialize: 1411 
Deserialize: 4380 

NetDataContractSerializer *** binary 
Length: 1139 
Serialize: 2014 
Deserialize: 5645 

JavaScriptSerializer *** text (json) 
Length: 528 
Serialize: 12050 
Deserialize: 30558 

(protobuf-net v2) *** binary 
Length: 112 
Serialize: 217 
Deserialize: 250 
+0

@FrankHileman niestety ludzie nadal domyślnie się na nim opierają, więc * konieczne * jest porównanie go, nawet jeśli gra w inną grę na innym polu (a wszyscy inni są w puli) –

1

Po pierwsze, XML jest nadętym formatem. Każdy bajt wysyłany w formie binarnej będzie podobny do co najmniej 2 lub 3 bajtów w XML. Na przykład, wysyłając numer "44" w postaci binarnej, potrzebujesz tylko jednego bajtu.W XML potrzebujesz tagu element plus dwa bajty, aby umieścić numer: <N>44</N>, który jest o wiele więcej danych.
Jedną z różnic jest czas kodowania/dekodowania wymagany do obsługi wiadomości. Ponieważ dane binarne są tak kompaktowe, nie pochłaniają zbyt wielu cykli zegara. Jeśli dane binarne są strukturą stałą, prawdopodobnie można je załadować bezpośrednio do pamięci i uzyskać dostęp do każdego elementu z niego bez potrzeby analizowania/rozbarwiania danych.
XML to format tekstowy, który wymaga kilku dodatkowych czynności do przetworzenia. Po pierwsze, format jest nadęty, więc zużywa więcej pamięci. Co więcej, wszystkie dane są tekstem i możesz potrzebować ich w formie binarnej, w związku z czym XML musi zostać przeanalizowany. Parsowanie nadal wymaga czasu na przetworzenie, bez względu na szybkość kodu. ASN.1 to format "binarnego XML", który stanowi dobrą alternatywę dla XML, ale który będzie musiał zostać przetworzony tak jak XML. Plus, jeśli większość danych, których używasz, to tekst, a nie cyfry, wtedy formaty binarne nie zrobią dużej różnicy.
Kolejny czynnik prędkości to łączny rozmiar danych. Gdy tylko załadujesz i zapiszesz plik binarny o wielkości 1 KB lub plik XML o wielkości 3 KB, prawdopodobnie nie zauważysz żadnej różnicy prędkości. Dzieje się tak, ponieważ dyski używają bloków o określonym rozmiarze do przechowywania danych. Do 4 KB łatwo mieści się w większości bloków dyskowych. Zatem dla dysku nie ma znaczenia, czy musi odczytać 1 KB lub 3 KB, ponieważ odczytuje cały blok 4KB. Ale gdy plik binarny ma 1 megabajt, a XML ma 3 megabajty, dysk będzie musiał przeczytać dużo więcej bloków, aby po prostu odczytać kod XML. (Lub go napisać). A nawet jeśli twój XML ma 3 MB lub tylko 2,99 MB lub 3,01 MB.
Przy transferze przez TCP/IP większość danych binarnych będzie kodowana przez UU. Dzięki kodowaniu UU twoje dane binarne będą rosnąć z 1 bajtem na każde 3 bajty danych. Dane XML nie będą kodowane, więc różnica w wielkości staje się mniejsza, a więc różnica prędkości staje się mniejsza. Jednak dane binarne będą nadal szybsze, ponieważ procedury kodowania/dekodowania mogą być naprawdę szybkie.
Zasadniczo rozmiar ma znaczenie. :-)

Ale z XML masz dodatkową alternatywę. Możesz wysyłać i przechowywać XML w formacie pliku ZIP. Microsoft Office robi to z nowszymi wersjami. Dokument Word jest tworzony jako plik XML, ale przechowywany jako część większego pliku ZIP. Łączy to w sobie to, co najlepsze z obu światów, ponieważ dokumenty programu Word to w większości tekst, więc format binarny nie zwiększyłby znacznie szybkości. Zipowanie XML sprawia, że ​​przechowywanie i wysyłanie danych jest o wiele szybsze po prostu przez uczynienie z niego binarnego. Co jeszcze bardziej interesujące, skompresowany plik XML może być mniejszy niż nieskompresowany plik binarny, dlatego spakowany XML staje się szybszy. (Ale to oszustwo, ponieważ XML jest teraz binarny ...)