Зависит от ваших приоритетов.
Если производительность является вашей абсолютной характеристикой вождения, то обязательно используйте самую быструю. Просто убедитесь, что у вас есть полное понимание различий, прежде чем сделать выбор
- В отличие от
serialize()
вас необходимо добавить дополнительный параметр, чтобы сохранить символы UTF-8 нетронутыми: json_encode($array, JSON_UNESCAPED_UNICODE)
(в противном случае он преобразует символы UTF-8 в escape-последовательности Unicode).
- JSON не будет иметь памяти о том, каким был исходный класс объекта (они всегда восстанавливаются как экземпляры stdClass).
- Вы не можете использовать
__sleep()
и __wakeup()
с JSON
- По умолчанию только открытые свойства сериализуются с помощью JSON. (
PHP>=5.4
вы можете реализовать JsonSerializable, чтобы изменить это поведение).
- JSON более переносим
И есть, вероятно, несколько других отличий, о которых я не могу думать в данный момент.
Простой тест скорости, чтобы сравнить два
<?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
), и в среднем это примерно на 131% быстрее, чем сейчас. Таким образом, в 5.4.x должно быть несколько хороших улучшений этой функции по сравнению с 5.3.x. В частности, я использую 5.4.24 на CentOS 6. Итак, ура для JSON!serialize() was roughly 35.04% faster than json_encode()
JSON проще и быстрее, чем формат сериализации PHP, и его следует использовать, если :
json_decode()
«Эта функция вернет false, если данные в кодировке JSON глубже 127 элементов».источник
Я написал статью на эту тему:
« Кэшировать большой массив: JSON, serialize или var_export? ». В этом посте показано, что сериализация - лучший выбор для маленьких и больших массивов. Для очень больших массивов (> 70 МБ) JSON - лучший выбор.источник
json_encode()
примерно на 80-150% быстрее (это действительно идет вверх и вниз), чемserialize()
, примерно с 300 итерациями. Но при использовании меньших массивов (array("teams" => array(1 => array(4 arrays of players), 2 => array(4 arrays of players)))
) я провел тестирование с 750 000 итераций, и в этом случаеserialize()
это примерно на 6-10% быстрее. Моя функция берет среднее время для всех итераций и сравнивает их. Я мог бы опубликовать это здесь как один из ответовВы также можете быть заинтересованы в https://github.com/phadej/igbinary - который предоставляет другой «механизм» сериализации для PHP.
Мои случайные / произвольные показатели «производительности» с использованием PHP 5.3.5 на 64-битной платформе показывают:
JSON:
Родной PHP:
Игбинар:
Таким образом, igbinary_serialize () и igbinary_unserialize () быстрее и занимают меньше места на диске.
Я использовал код fillArray (0, 3), как указано выше, но сделал ключи массива более длинными.
igbinary может хранить те же типы данных, что и собственная сериализация PHP (поэтому нет проблем с объектами и т. д.), и вы можете указать PHP5.3 использовать его для обработки сеансов, если вы того пожелаете.
Смотрите также http://ilia.ws/files/zendcon_2010_hidden_features.pdf - конкретные слайды 14/15/16
источник
Y только что протестировал сериализованный код, а json кодирует и декодирует, плюс размер, который он будет хранить в сохраненной строке.
Мы можем заключить, что JSON кодирует быстрее и приводит к меньшей строке, но unserialize быстрее декодирует строку.
источник
Если вы кэшируете информацию, которую в конечном итоге захотите «включить» на более позднем этапе, вы можете попробовать использовать var_export . Таким образом, вы получаете удар только в «сериализации», а не в «сериализации».
источник
Я добавил тест, чтобы включить производительность десериализации. Вот цифры, которые я получил.
Таким образом, json, кажется, быстрее для кодирования, но медленнее в декодировании. Так что это может зависеть от вашего приложения и того, что вы ожидаете сделать больше всего.
источник
Действительно хорошая тема и после прочтения нескольких ответов, я хочу поделиться своими экспериментами на эту тему.
У меня есть сценарий использования, когда к какой-то «огромной» таблице нужно обращаться почти каждый раз, когда я общаюсь с базой данных (не спрашиваю почему, просто факт). Система кэширования базы данных не подходит, так как она не будет кэшировать различные запросы, поэтому я думаю о системах кэширования php.
Я пытался,
apcu
но это не соответствовало потребностям, в этом случае память недостаточно надежна. Следующим шагом было кеширование в файл с сериализацией.В таблице 14355 записей с 18 столбцами, это мои тесты и статистика чтения сериализованного кэша:
JSON:
Как вы все сказали, основное неудобство с
json_encode
/json_decode
заключается в том, что он преобразует все вStdClass
экземпляр (или объект). Если вам нужно зациклить его, вы, вероятно, будете преобразовывать его в массив, и да, это увеличивает время преобразованияMsgpack
@hutch упоминает msgpack . Симпатичный сайт. Давайте попробуем?
Это лучше, но требует нового расширения; компиляция иногда боится людей ...
IgBinary
@GingerDog упоминает igbinary . Обратите внимание, что я установил,
igbinary.compact_strings=Off
потому что меня больше интересует производительность чтения, чем размер файла.Лучше, чем MSG Pack. Тем не менее, этот тоже требует компиляции.
serialize
/unserialize
Чем лучше производительность, чем JSON, тем больше массив, тем медленнее
json_decode
, но вы уже новичок в этом.Эти внешние расширения сужают размер файла и кажутся великолепными на бумаге. Числа не лгут *. Какой смысл компилировать расширение, если вы получаете почти те же результаты, что и при использовании стандартной функции PHP?
Мы также можем сделать вывод, что в зависимости от ваших потребностей вы выберете что-то другое, чем кто-либо другой:
Вот и все, еще одно сравнение методов сериализации, чтобы помочь вам выбрать один!
* Протестировано с PHPUnit 3.7.31, php 5.5.10 - только декодирование со стандартным жестким диском и старым двухъядерным процессором - средние числа в 10 тестах с одинаковыми вариантами использования, ваша статистика может отличаться
источник
json_decode($object, true)
, что в основном это будет происходить так же, как и(array) json_decode($object)
рекурсивно, так что это будет одинаковым поведением, и это будет иметь значительные затраты в обоих случаях. Обратите внимание , что я не тестировал производительность между посмотреть различиеStdClass
и ,array
но это не совсем точек здесь.Похоже, я буду использовать serialize по двум причинам:
Кто-то указал, что unserialize быстрее, чем json_decode, и случай «чтения» звучит более вероятно, чем случай «записи».
У меня были проблемы с json_encode при наличии строк с недопустимыми символами UTF-8. Когда это происходит, строка оказывается пустой, что приводит к потере информации.
источник
Я очень тщательно протестировал это на довольно сложном, слегка вложенном мультихэше со всеми видами данных (строка, NULL, целые числа), и сериализация / десериализация закончилась намного быстрее, чем json_encode / json_decode.
Единственное преимущество, которое json имеет в моих тестах, это меньший «упакованный» размер.
Это сделано в PHP 5.3.3, дайте мне знать, если вы хотите больше деталей.
Вот результаты тестов, а затем код для их создания. Я не могу предоставить тестовые данные, так как они раскрывают информацию, которую я не могу выпустить в дикую природу.
источник
Я также сделал небольшой тест. Мои результаты были одинаковыми. Но мне нужно производительность декодирования. То, что я заметил, как сказали несколько человек выше,
unserialize
быстрее, чемjson_decode
.unserialize
занимает примерно 60-70%json_decode
времени. Итак, вывод довольно прост: когда вам нужна производительность при кодировании, используйтеjson_encode
, когда вам нужна производительность при декодировании, используйтеunserialize
. Поскольку вы не можете объединить две функции, вы должны сделать выбор, где вам нужно больше производительности.Мой тест в псевдо:
На avarage: unserialize выиграл 96 раз по сравнению с json_decode. С средним значением 1,5 мс над 2,5 мс.
источник
Прежде чем принять окончательное решение, имейте в виду, что формат JSON небезопасен для ассоциативных массивов -
json_decode()
вместо этого он будет возвращать их в виде объектов:Выход:
источник
json_encode
ассоциативный массив, вы можете легко принудительно вернуть его обратно в массив следующим образом:$json = json_encode($some_assoc_array); $back_to_array = (array)json_decode($json);
также хорошо отметить, что вы можете обращаться к объектам так же, как к массивам в PHP, так и в типичном сценарии, никто бы даже не знал разницу. Хороший момент, хотя!Во-первых, я изменил сценарий, чтобы сделать еще несколько тестов (а также выполнить 1000 прогонов вместо 1):
Я использовал эту сборку PHP 7:
И мои результаты были:
Так ясно , сериализации / десериализации является самым быстрым способом, в то время как json_encode / декодирования является самым портативным.
Если вы рассматриваете сценарий, в котором вы читаете / записываете сериализованные данные в 10 раз или чаще, чем вам нужно отправлять или получать из системы, отличной от PHP, вам все равно лучше использовать сериализацию / десериализацию и иметь json_encode или json_decode до сериализации с точки зрения времени.
источник
Проверьте результаты здесь (извините за взлом, поместив код PHP в поле кода JS):
http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/
РЕЗУЛЬТАТЫ:
serialize()
иunserialize()
оба они значительно быстрее в PHP 5.4 на массивах различного размера.Я сделал тестовый скрипт на реальных данных для сравнения json_encode и serialize и json_decode и unserialize. Тест проводился на системе кеширования на сайте электронной коммерции. Он просто берет данные, уже находящиеся в кеше, и проверяет время кодирования / декодирования (или сериализации / десериализации) всех данных, и я помещаю их в легко видимую таблицу.
Я запустил это на сервере общего хостинга PHP 5.4.
Результаты были очень убедительными, что для этих больших и малых наборов данных сериализация и десериализация были явными победителями. В частности, для моего случая использования json_decode и unserialize являются наиболее важными для системы кэширования. Unserialize был почти повсеместным победителем здесь. Обычно это было в 2-4 раза (иногда в 6 или 7 раз) быстрее, чем json_decode.
Интересно отметить разницу в результатах от @ peter-bailey.
Вот код PHP, используемый для генерации результатов:
источник
просто к сведению - если вы хотите сериализовать ваши данные в что-то легкое для чтения и понимания, как JSON, но с большим сжатием и более высокой производительностью, вы должны проверить пакет сообщений.
источник
JSON лучше, если вы хотите сделать резервную копию данных и восстановить их на другом компьютере или через FTP.
Например, при использовании serialize, если вы храните данные на сервере Windows, загружаете их по FTP и восстанавливаете на Linux, они больше не могут работать из-за перекодировки charachter, потому что serialize хранит длину строк и в Unicode > UTF-8, транскодирующий некоторый 1-байтовый символ, может иметь длину 2 байта, что приводит к сбою алгоритма.
источник
THX - для этого кода теста:
Мои результаты для массива, который я использую для конфигурации, выглядят как пара: JSON, закодированный за 0,0031511783599854 секунды,
PHP, сериализованный за 0,0037961006164551 секунд,
json_encode()
был примерно на 20,47% быстрее, чемserialize()
JSON, закодированный за 0,0070841312408447 секунд,PHP, сериализованный за 0,0035839080810547 секунд,
unserialize()
был примерно на 97,66% быстрее, чемjson_encode()
Так что - проверьте это на своих данных.
источник
Если подытожить то, что люди здесь говорят, json_decode / encode кажется быстрее, чем serialize / unserialize, НО Если вы выполните var_dump, тип сериализованного объекта будет изменен. Если по какой-то причине вы хотите сохранить тип, переходите к serialize!
(попробуйте например stdClass vs array)
сериализации / десериализации:
JSON кодировать / декодировать
Как вы можете видеть, json_encode / decode преобразует все в stdClass, что не очень хорошо, информация об объекте теряется ... Так что решайте исходя из потребностей, особенно если это не только массивы ...
источник
Я бы предложил вам использовать Super Cache, который является механизмом файлового кэша, который не будет использовать
json_encode
илиserialize
. Он прост в использовании и действительно быстр по сравнению с другим механизмом PHP Cache.https://packagist.org/packages/smart-php/super-cache
Пример:
источник