Naprawdę fajny temat i po przeczytaniu kilku odpowiedzi chcę podzielić się moimi eksperymentami na ten temat.
Dostałem przypadek użycia, w którym niemal za każdym razem, gdy rozmawiam z bazą danych, trzeba zapytać o „ogromną” tabelę (nie pytaj dlaczego, tylko fakt). System buforowania bazy danych nie jest odpowiedni, ponieważ nie buforuje różnych żądań, więc pomyślałem o systemach buforowania php.
Próbowałem, apcu
ale nie pasowało do potrzeb, pamięć nie jest w tym przypadku wystarczająco niezawodna. Następnym krokiem było umieszczenie w pamięci podręcznej pliku z serializacją.
Tabela zawiera 14355 pozycji z 18 kolumnami, są to moje testy i statystyki dotyczące odczytu zserializowanej pamięci podręcznej:
JSON:
Jak wszyscy powiedzieliście, główną niedogodnością związaną z json_encode
/ json_decode
jest to, że przekształca wszystko w StdClass
instancję (lub obiekt). Jeśli potrzebujesz go zapętlić, prawdopodobnie zrobisz to, przekształcając go w tablicę, i tak, to wydłuża czas transformacji
średni czas: 780,2 ms; wykorzystanie pamięci: 41,5 MB; rozmiar pliku pamięci podręcznej: 3,8 MB
Msgpack
@hutch wspomina o msgpack . Ładna strona internetowa. Spróbujmy, prawda?
średni czas: 497 ms; wykorzystanie pamięci: 32 MB; rozmiar pliku pamięci podręcznej: 2,8 MB
To lepiej, ale wymaga nowego rozszerzenia; kompilowanie czasem przestraszonych ludzi ...
IgBinary
@ GingerDog wspomina o igbinary . Zauważ, że ustawiłem, igbinary.compact_strings=Off
ponieważ bardziej zależy mi na wydajności czytania niż na rozmiarze pliku.
średni czas: 411,4 ms; wykorzystanie pamięci: 36,75 MB; rozmiar pliku pamięci podręcznej: 3,3 MB
Lepsze niż paczka msg. Jednak ten także wymaga kompilacji.
serialize
/unserialize
średni czas: 477,2 ms; wykorzystanie pamięci: 36,25 MB; rozmiar pliku pamięci podręcznej: 5,9 MB
Im lepsza wydajność niż JSON, tym większa matryca, wolniejsza json_decode
, ale już to nowe.
Te rozszerzenia zewnętrzne zmniejszają rozmiar pliku i wydają się świetne na papierze. Liczby nie kłamią *. Po co kompilować rozszerzenie, jeśli uzyskasz prawie takie same wyniki, jak w przypadku standardowej funkcji PHP?
Możemy również wywnioskować, że w zależności od potrzeb wybierzesz coś innego niż ktoś inny:
- IgBinary jest naprawdę fajny i działa lepiej niż MsgPack
- Msgpack lepiej kompresuje twoje dane (zauważ, że nie wypróbowałem opcji igbinary compact.string).
- Nie chcesz kompilować? Użyj standardów.
To wszystko, kolejne porównanie metod serializacji, które pomogą ci wybrać tę!
* Testowane z PHPUnit 3.7.31, php 5.5.10 - tylko dekodowanie ze standardowym dyskiem twardym i starym dwurdzeniowym procesorem - średnie liczby w 10 takich samych testach przypadków użycia, twoje statystyki mogą być inne
JSON_UNESCAPED_UNICODE
.