Dlaczego serializacja binarna jest uważana za szybszą od serializacji xml?Dlaczego serializacja binarna jest szybsza niż serializacja xml?
Odpowiedz
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 .
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
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ć. –
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
@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) –
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 ...)
- 1. Serializacja binarna vs. JSON kontra xml
- 2. Serializacja XML wyliczeń
- 3. Serializacja XML Dynamic Ignore
- 4. Serializacja Xml ReadOnlyCollections
- 5. Serializacja XML w C#
- 6. Serializacja XML listy z atrybutami
- 7. Jak zidentyfikować pole powodujące, że serializacja binarna zawiedzie w .NET?
- 8. XML Serializacja wartości domyślnych opcjonalnych atrybutów
- 9. Jakie dane są przekazywane w serializacji? (Serializacja binarna)
- 10. Szybka prosta serializacja obiektów
- 11. Serializacja XML - inny wynik w .NET 4.0
- 12. Serializacja interfejsy
- 13. JSON.Net Xml Serializacja źle rozumie tablice
- 14. .NET Serializacja XML na podstawie XSD?
- 15. Serializacja XML i przedrostki przestrzeni nazw
- 16. Web API - serializacja dynamiczna do XML
- 17. Kiedy należy używać Serializacji XML a Serializacja Binarna w środowisku .NET?
- 18. Dlaczego akumulacja jest szybsza niż cykl prosty?
- 19. Dlaczego wektoryzacja jest szybsza niż pętle?
- 20. Serializacja struktury danych Clojure
- 21. Serializacja MVC JsonResult camelCase
- 22. Serializacja Javascript typów maszyn
- 23. Cechy i serializacja/deserializacja
- 24. Serializacja statycznej klasy wewnętrznej
- 25. Serializacja klasy STL
- 26. Serializacja w Scala/Akka
- 27. Serializacja BigDecimal w GWT
- 28. .NET Serializacja Kolejność
- 29. Serializacja Easy Scala?
- 30. Asynchroniczna serializacja protobuf
Proszę wyjaśnić swoje pytanie. Czy pytasz, czy jeden jest szybszy od drugiego, czy też dlaczego jeden jest szybszy od drugiego? – Oded