Zależy od twoich priorytetów.
Jeśli wydajność jest Twoją absolutną cechą jezdną, to na pewno użyj najszybszej. Przed dokonaniem wyboru upewnij się, że w pełni rozumiesz różnice
- W przeciwieństwie
serialize()
do tego musisz dodać dodatkowy parametr, aby znaki UTF-8 pozostały nietknięte:json_encode($array, JSON_UNESCAPED_UNICODE)
(w przeciwnym razie konwertuje znaki UTF-8 na sekwencje specjalne Unicode).
- JSON nie będzie pamiętał, jaka była pierwotna klasa obiektu (zawsze są one przywracane jako instancje stdClass).
- Nie możesz wykorzystać dźwigni
__sleep()
i __wakeup()
przy pomocy JSON
- Domyślnie tylko właściwości publiczne są serializowane za pomocą JSON. (w
PHP>=5.4
możesz zaimplementować JsonSerializable aby zmienić to zachowanie).
- JSON jest bardziej przenośny
I prawdopodobnie jest jeszcze kilka innych różnic, o których nie mogę teraz myśleć.
Prosty test prędkości, aby porównać oba
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Make a big, honkin test array
// You may need to adjust this depth to avoid memory limit errors
$testArray = fillArray(0, 5);
// Time json encoding
$start = microtime(true);
json_encode($testArray);
$jsonTime = microtime(true) - $start;
echo "JSON encoded in $jsonTime seconds\n";
// Time serialization
$start = microtime(true);
serialize($testArray);
$serializeTime = microtime(true) - $start;
echo "PHP serialized in $serializeTime seconds\n";
// Compare them
if ($jsonTime < $serializeTime) {
printf("json_encode() was roughly %01.2f%% faster than serialize()\n", ($serializeTime / $jsonTime - 1) * 100);
}
else if ($serializeTime < $jsonTime ) {
printf("serialize() was roughly %01.2f%% faster than json_encode()\n", ($jsonTime / $serializeTime - 1) * 100);
} else {
echo "Impossible!\n";
}
function fillArray( $depth, $max ) {
static $seed;
if (is_null($seed)) {
$seed = array('a', 2, 'c', 4, 'e', 6, 'g', 8, 'i', 10);
}
if ($depth < $max) {
$node = array();
foreach ($seed as $key) {
$node[$key] = fillArray($depth + 1, $max);
}
return $node;
}
return 'empty';
}
JSON_UNESCAPED_UNICODE
.json_encode
) i jest to średnio około 131% szybciej niż teraz serializacja. Tak więc w wersji 5.4.x w stosunku do wersji 5.3.x trzeba wprowadzić całkiem niezłe ulepszenia tej funkcji W szczególności korzystam z wersji 5.4.24 na CentOS 6. Więc tak, JSON !!serialize() was roughly 35.04% faster than json_encode()
JSON jest prostszy i szybszy niż format serializacji PHP i powinien być używany, chyba że :
json_decode()
„Ta funkcja zwróci false, jeśli dane zakodowane w JSON są głębsze niż 127 elementów”.źródło
Napisałem blog na ten temat:
„ Buforuj dużą tablicę: JSON, serializować czy var_export? ”. W tym poście pokazano, że serializacja jest najlepszym wyborem dla macierzy od małych do dużych. W przypadku bardzo dużych tablic (> 70 MB) JSON jest lepszym wyborem.źródło
json_encode()
jest on około 80% do 150% szybszy (tam naprawdę idzie tam i z góry) niżserialize()
, z około 300 iteracjami. Ale kiedy używałem mniejszych tablic (array("teams" => array(1 => array(4 arrays of players), 2 => array(4 arrays of players)))
), testowałem z 750 000 iteracji i w tym przypadkuserialize()
jest on około 6% do 10% szybszy. Moja funkcja bierze średni czas dla wszystkich iteracji i porównuje je. Mogę opublikować go tutaj jako jedną z odpowiedziMoże Cię również zainteresować https://github.com/phadej/igbinary - który zapewnia inny „silnik” serializacji dla PHP.
Moje losowe / arbitralne dane dotyczące „wydajności” za pomocą PHP 5.3.5 na platformie 64-bitowej pokazują:
JSON:
Natywny PHP:
Igbinary:
Szybsze jest więc igbinary_serialize () i igbinary_unserialize () i zużywa mniej miejsca na dysku.
Użyłem kodu fillArray (0, 3) jak powyżej, ale wydłużyłem klucze tablicy.
igbinary może przechowywać te same typy danych, co natywna serializacja PHP (więc nie ma problemu z obiektami itp.) i możesz powiedzieć PHP5.3, aby używał go do obsługi sesji, jeśli chcesz.
Zobacz także http://ilia.ws/files/zendcon_2010_hidden_features.pdf - w szczególności slajdy 14/15/16
źródło
Właśnie przetestowałem serializację i kodowanie i dekodowanie json, plus rozmiar, jaki zajmie zapisany ciąg.
Możemy dojść do wniosku, że JSON koduje szybciej i daje mniejszy ciąg, ale odserializacja jest szybsza w dekodowaniu łańcucha.
źródło
Jeśli buforujesz informacje, które ostatecznie chcesz „dołączyć” w późniejszym czasie, możesz spróbować użyć var_export . W ten sposób trafiasz tylko w „serializuj”, a nie w „odserializuj”.
źródło
Rozszerzyłem test, aby uwzględnić wydajność bezserializacji. Oto liczby, które mam.
Więc json wydaje się być szybszy do kodowania, ale powolny w dekodowaniu. Może to zależeć od twojej aplikacji i tego, czego oczekujesz najbardziej.
źródło
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 wStdClass
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 transformacjiMsgpack
@hutch wspomina o msgpack . Ładna strona internetowa. Spróbujmy, prawda?
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.Lepsze niż paczka msg. Jednak ten także wymaga kompilacji.
serialize
/unserialize
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:
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
źródło
json_decode($object, true)
, w zasadzie zrobi to samo,(array) json_decode($object)
ale rekurencyjnie, więc byłoby to takie samo zachowanie i będzie miało znaczny koszt w obu przypadkach. Zauważ, że nie testowałem dyferencjału między wydajnościąStdClass
aarray
ale to naprawdę nie jest punktem tutaj.Wydaje się, że serializacja jest tym, którego zamierzam użyć z 2 powodów:
Ktoś zauważył, że odserializacja jest szybsza niż json_decode, a przypadek „odczytu” wydaje się bardziej prawdopodobny niż przypadek „zapisu”.
Mam problem z json_encode, gdy mam ciągi znaków z nieprawidłowymi znakami UTF-8. Kiedy tak się dzieje, łańcuch zostaje pusty, co powoduje utratę informacji.
źródło
Testowałem to bardzo dokładnie na dość złożonym, lekko zagnieżdżonym multi-hash z wszystkimi rodzajami danych (string, NULL, liczby całkowite), a serializacja / deserializacja zakończyła się znacznie szybciej niż json_encode / json_decode.
Jedyną zaletą, jaką Json miał w moich testach, był mniejszy „zapakowany” rozmiar.
Odbywa się to w PHP 5.3.3, daj mi znać, jeśli chcesz więcej szczegółów.
Oto wyniki testów, a następnie kod do ich wytworzenia. Nie mogę dostarczyć danych testowych, ponieważ ujawniłyby one informacje, których nie mogę wypuścić na wolności.
źródło
Zrobiłem też mały test porównawczy. Moje wyniki były takie same. Ale potrzebuję wydajności dekodowania. Tam, gdzie zauważyłem, podobnie jak kilka wyżej wspomnianych osób,
unserialize
jest szybsze niżjson_decode
.unserialize
zajmuje około 60-70%json_decode
czasu. Wniosek jest więc dość prosty: kiedy potrzebujesz wydajności kodowania, używajjson_encode
, kiedy potrzebujesz wydajności dekodowania, używajunserialize
. Ponieważ nie można połączyć tych dwóch funkcji, musisz dokonać wyboru, w którym potrzebujesz większej wydajności.Mój punkt odniesienia w pseudo:
On avarage: unserialize wygrał 96 razy ponad 4 razy kod json_decode. Średni czas około 1,5 ms ponad 2,5 ms.
źródło
Przed podjęciem ostatecznej decyzji należy pamiętać, że format JSON nie jest bezpieczny dla tablic asocjacyjnych -
json_decode()
zamiast tego zwróci je jako obiekty:Dane wyjściowe to:
źródło
json_encode
to tablica asocjacyjna, możesz łatwo zmusić ją z powrotem do tablicy w taki sposób:$json = json_encode($some_assoc_array); $back_to_array = (array)json_decode($json);
Warto również zauważyć, że możesz uzyskać dostęp do obiektów w taki sam sposób jak tablice w PHP, więc w typowym scenariuszu, nie wiadomo nawet różnicy. Dobra uwaga!Po pierwsze, zmieniłem skrypt, aby wykonać więcej testów porównawczych (a także wykonać 1000 uruchomień zamiast tylko 1):
Użyłem tej wersji PHP 7:
A moje wyniki to:
Tak wyraźnie , serialize / unserialize to najszybsza metoda, natomiast json_encode / dekodowania jest najbardziej przenośny.
Jeśli weźmiesz pod uwagę scenariusz, w którym odczytujesz / zapisujesz dane szeregowane 10 razy lub częściej niż musisz wysyłać lub odbierać z systemu innego niż PHP, WCIĄŻ lepiej jest użyć serializacji / odserializować i mieć json_encode lub json_decode przed serializacją pod względem czasu.
źródło
Sprawdź wyniki tutaj (przepraszam za włamanie do umieszczenia kodu PHP w polu kodu JS):
http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/
WYNIKI:
serialize()
iunserialize()
oba są znacznie szybsze w PHP 5.4 na tablicach o różnej wielkości.Zrobiłem skrypt testowy na rzeczywistych danych do porównywania json_encode vs serialize i json_decode vs unserialize. Test został przeprowadzony w systemie buforowania witryny e-commerce w produkcji. Po prostu bierze dane już znajdujące się w pamięci podręcznej i testuje czasy kodowania / dekodowania (lub serializacji / odserializowania) wszystkich danych, a ja umieszczam je w łatwo widocznej tabeli.
Uruchomiłem to na dzielonym serwerze hostingowym PHP 5.4.
Wyniki były bardzo rozstrzygające, że dla tych dużych i małych zestawów danych serializowanie i odserializowanie były wyraźnymi zwycięzcami. W szczególności w moim przypadku użycia, json_decode i unserialize są najważniejsze dla systemu buforowania. Unserialize był tutaj niemal wszechobecnym zwycięzcą. Zazwyczaj było to 2 do 4 razy (czasem 6 lub 7 razy) tak szybko, jak json_decode.
Warto zauważyć różnicę w wynikach z @ peter-bailey.
Oto kod PHP używany do generowania wyników:
źródło
po prostu fyi - jeśli chcesz serializować swoje dane do czegoś łatwego do odczytania i zrozumienia, takiego jak JSON, ale z większą kompresją i wyższą wydajnością, powinieneś sprawdzić pakiet wiadomości.
źródło
JSON jest lepszy, jeśli chcesz wykonać kopię zapasową danych i przywrócić ją na innym komputerze lub przez FTP.
Na przykład z serializacją, jeśli przechowujesz dane na serwerze Windows, pobierz je przez FTP i przywróć na Linuksie, który nie mógłby już działać z powodu ponownego kodowania charachtera, ponieważ serializacja przechowuje długość łańcuchów i w Unicode > Transkodowanie UTF-8 około 1 bajtowego charachtera może mieć długość 2 bajtów, co powoduje awarię algorytmu.
źródło
THX - dla tego kodu testu porównawczego:
Moje wyniki w tablicy, której używam do konfiguracji, są następujące: JSON zakodowany w 0,0031511783599854 sekund
PHP serializowany w 0,0037961006164551 sekund
json_encode()
był około 20,47% szybszy niżserialize()
JSON zakodowany w 0,0070841312408447 sekundPHP serializowany w 0,0035839080810547 sekund
unserialize()
był około 97,66% szybszy niżjson_encode()
Więc - przetestuj na własnych danych.
źródło
Jeśli podsumowując to, co mówią ludzie, json_decode / encode wydaje się szybszy niż serializacja / unserializuj ALE Jeśli zrobisz var_dump, typ serializowanego obiektu zostanie zmieniony. Jeśli z jakiegoś powodu chcesz zachować ten typ, skorzystaj z serializacji!
(spróbuj na przykład stdClass vs array)
serializuj / odserializuj:
json encode / decode
Jak widać, json_encode / decode konwertuje wszystko na stdClass, co nie jest aż tak dobre, informacje o obiektach są tracone ... Więc decyduj na podstawie potrzeb, szczególnie jeśli nie są to tylko tablice ...
źródło
Sugeruję, abyś użył Super Cache, która jest mechanizmem buforowania plików, który nie użyje
json_encode
lubserialize
. Jest prosty w użyciu i bardzo szybki w porównaniu do innych mechanizmów PHP Cache.https://packagist.org/packages/smart-php/super-cache
Dawny:
źródło