Depende das suas prioridades.
Se o desempenho é a sua característica de condução absoluta, use sempre a mais rápida. Apenas certifique-se de ter um entendimento completo das diferenças antes de fazer uma escolha
- Ao contrário,
serialize()
você precisa adicionar um parâmetro extra para manter os caracteres UTF-8 intocados: json_encode($array, JSON_UNESCAPED_UNICODE)
(caso contrário, converte caracteres UTF-8 em seqüências de escape Unicode).
- JSON não terá memória da classe original do objeto (eles sempre são restaurados como instâncias de stdClass).
- Você não pode aproveitar
__sleep()
e __wakeup()
com JSON
- Por padrão, apenas propriedades públicas são serializadas com JSON. (
PHP>=5.4
você pode implementar o JsonSerializable para alterar esse comportamento).
- JSON é mais portátil
E provavelmente há outras diferenças em que não consigo pensar no momento.
Um teste de velocidade simples para comparar os dois
<?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
) e está em média 131% mais rápido do que o serializado agora. Portanto, deve haver algumas melhorias bastante agradáveis nessa função no 5.4.x sobre o 5.3.x. Especificamente, estou executando o 5.4.24 no CentOS 6. Então, sim para o JSON !!serialize() was roughly 35.04% faster than json_encode()
JSON é mais simples e mais rápido que o formato de serialização do PHP e deve ser usado, a menos que :
json_decode()
:: "Esta função retornará false se os dados codificados em JSON tiverem mais de 127 elementos".fonte
Eu escrevi uma postagem no blog sobre este assunto:
" Cache de uma grande matriz: JSON, serialize ou var_export? ". Neste post, é mostrado que serializar é a melhor opção para matrizes de pequeno a grande porte. Para matrizes muito grandes (> 70 MB), o JSON é a melhor escolha.fonte
json_encode()
é cerca de 80% a 150% mais rápida (realmente está subindo e descendo) do queserialize()
, com cerca de 300 iterações. Mas, ao usar matrizes menores (array("teams" => array(1 => array(4 arrays of players), 2 => array(4 arrays of players)))
), testei com 750.000 iterações eserialize()
é cerca de 6% a 10% mais rápido nesse caso. Minha função leva os tempos médios para todas as iterações e as compara. Eu poderia publicá-la aqui como uma das respostasVocê também pode estar interessado em https://github.com/phadej/igbinary - que fornece um 'mecanismo' de serialização diferente para PHP.
Meus números aleatórios / arbitrários de 'desempenho', usando o PHP 5.3.5 em uma plataforma de 64 bits, mostram:
JSON:
PHP nativo:
Igbinário:
Portanto, é mais rápido igbinary_serialize () e igbinary_unserialize () e usa menos espaço em disco.
Usei o código fillArray (0, 3) como acima, mas fiz com que as chaves da matriz fossem mais longas.
O igbinary pode armazenar os mesmos tipos de dados que o serializado nativo do PHP pode (portanto, não há problema com objetos, etc.) e você pode dizer ao PHP5.3 para usá-lo no tratamento de sessões, se assim o desejar.
Veja também http://ilia.ws/files/zendcon_2010_hidden_features.pdf - especificamente slides 14/15/16
fonte
Você acabou de testar serializado e json codificar e decodificar, mais o tamanho que ele levará para a cadeia armazenada.
Podemos concluir que o JSON codifica mais rapidamente e resulta em uma string menor, mas a desserialização é mais rápida para decodificar a string.
fonte
Se você estiver armazenando em cache as informações que desejará "incluir" posteriormente, tente usar var_export . Dessa forma, você recebe apenas o hit no "serializar" e não no "desserializar".
fonte
Aumentei o teste para incluir o desempenho de desserialização. Aqui estão os números que eu tenho.
Então, o json parece ser mais rápido para codificação, mas lento na decodificação. Portanto, isso pode depender da sua aplicação e do que você espera fazer mais.
fonte
Tópico muito bom e depois de ler as poucas respostas, quero compartilhar minhas experiências sobre o assunto.
Eu tenho um caso de uso em que alguma tabela "enorme" precisa ser consultada quase toda vez que eu falo com o banco de dados (não pergunte o porquê, apenas um fato). O sistema de armazenamento em cache do banco de dados não é apropriado, pois não armazenará em cache as diferentes solicitações, por isso pensei em sistemas de cache php.
eu tentei
apcu
mas não atendia às necessidades, a memória não é suficientemente confiável nesse caso. O próximo passo foi armazenar em cache um arquivo com serialização.A tabela possui 14355 entradas com 18 colunas; esses são meus testes e estatísticas sobre a leitura do cache serializado:
JSON:
Como você disse, o grande inconveniente com
json_encode
/json_decode
é que ele transforma tudo em umaStdClass
instância (ou Objeto). Se você precisar fazer um loop, transformá-lo em uma matriz é o que você provavelmente fará, e sim, está aumentando o tempo de transformaçãoMsgpack
O @hutch menciona o msgpack . Site bonito. Vamos tentar, não é?
Isso é melhor, mas requer uma nova extensão; compilando pessoas às vezes com medo ...
IgBinary
@GingerDog menciona igbinary . Observe que eu configurei o
igbinary.compact_strings=Off
porque me preocupo mais com a leitura do que com o tamanho do arquivo.Melhor que o pacote msg. Ainda assim, este também requer compilação.
serialize
/unserialize
Melhores desempenhos que o JSON, quanto maior a matriz, mais lento
json_decode
é, mas você já é novo nisso.Essas extensões externas estão diminuindo o tamanho do arquivo e parecem ótimas no papel. Os números não mentem *. Qual o sentido de compilar uma extensão se você obtiver quase os mesmos resultados que obteria com uma função PHP padrão?
Também podemos deduzir que, dependendo de suas necessidades, você escolherá algo diferente de outra pessoa:
É isso aí, outra comparação de métodos de serialização para ajudar você a escolher esse!
* Testado com PHPUnit 3.7.31, php 5.5.10 - somente decodificando com um hardrive padrão e uma CPU dual core antiga - números médios em 10 testes de casos de uso iguais, suas estatísticas podem ser diferentes
fonte
json_decode($object, true)
, basicamente, ele fará o mesmo,(array) json_decode($object)
mas recursivamente, para que seja o mesmo comportamento e tenha um custo significativo nos dois casos. Observe que eu não testei as diferenças de desempenho entreStdClass
e,array
mas esse não é realmente o ponto aqui.Parece que serializar é o que eu vou usar por 2 razões:
Alguém apontou que a desserialização é mais rápida que json_decode e um caso de 'leitura' parece mais provável que um caso de 'gravação'.
Eu tive problemas com json_encode ao ter strings com caracteres UTF-8 inválidos. Quando isso acontece, a string acaba vazia, causando perda de informações.
fonte
Eu testei isso minuciosamente em um multi-hash bastante complexo e levemente aninhado, com todos os tipos de dados (string, NULL, inteiros), e serialize / unserialize acabou muito mais rápido que json_encode / json_decode.
A única vantagem que o json tem nos meus testes foi o tamanho 'compactado' menor.
Isso é feito no PHP 5.3.3, deixe-me saber se você deseja mais detalhes.
Aqui estão os resultados dos testes e o código para produzi-los. Não posso fornecer os dados do teste, pois revelariam informações que não posso deixar sair na natureza.
fonte
Também fiz uma pequena referência. Meus resultados foram os mesmos. Mas preciso do desempenho da decodificação. Onde eu notei, como algumas pessoas acima disseram também,
unserialize
é mais rápido quejson_decode
.unserialize
leva aproximadamente 60-70% dojson_decode
tempo. Portanto, a conclusão é bastante simples: quando você precisar de desempenho na codificação, usejson_encode
, quando precisar de desempenho ao decodificar, useunserialize
. Como você não pode mesclar as duas funções, você deve escolher onde precisa de mais desempenho.Minha referência em pseudo:
Em avarage: unserialize ganhou 96 vezes mais de 4 vezes o json_decode. Com uma média de aproximadamente 1.5ms sobre 2.5ms.
fonte
Antes de tomar sua decisão final, lembre-se de que o formato JSON não é seguro para matrizes associativas - as
json_decode()
retornará como objetos:A saída é:
fonte
json_encode
era uma matriz associativa, pode facilmente forçá-la novamente a uma matriz da seguinte forma:$json = json_encode($some_assoc_array); $back_to_array = (array)json_decode($json);
Também é bom observar que você pode acessar os objetos da mesma maneira que as matrizes no PHP, em um cenário típico, ninguém sequer saberia a diferença. Bom ponto!Primeiro, mudei o script para fazer mais alguns testes comparativos (e também fazer 1000 execuções em vez de apenas 1):
Eu usei essa compilação do PHP 7:
E meus resultados foram:
Tão claramente que serializar / desserializar é o método mais rápido , enquanto json_encode / decode é o mais portátil.
Se você considerar um cenário em que lê / grava dados serializados 10x ou mais frequentemente do que o necessário para enviar ou receber a partir de um sistema que não seja PHP, ainda é melhor usar serializar / desserializar e tê-lo json_encode ou json_decode antes da serialização em termos de tempo.
fonte
Confira os resultados aqui (desculpe pelo hack colocando o código PHP na caixa de código JS):
http://jsfiddle.net/newms87/h3b0a0ha/embedded/result/
RESULTADOS:
serialize()
eunserialize()
são significativamente mais rápidos no PHP 5.4 em matrizes de tamanhos variados.Eu fiz um script de teste em dados do mundo real para comparar json_encode vs serialize e json_decode vs unserialize. O teste foi executado no sistema de cache de um site de comércio eletrônico em produção. Ele simplesmente pega os dados já no cache e testa os tempos para codificar / decodificar (ou serializar / desserializar) todos os dados e eu os coloco em uma tabela fácil de ver.
Eu executei isso no servidor de hospedagem compartilhada PHP 5.4.
Os resultados foram muito conclusivos que, para esses conjuntos de dados grandes e pequenos, serializar e desserializar foram os vencedores. Especialmente para o meu caso de uso, o json_decode e unserialize são os mais importantes para o sistema de armazenamento em cache. Unserialize foi quase um vencedor onipresente aqui. Geralmente era de 2 a 4 vezes (às vezes 6 ou 7) mais rápido que json_decode.
É interessante notar a diferença nos resultados de @ peter-bailey.
Aqui está o código PHP usado para gerar os resultados:
fonte
apenas um fyi - se você deseja serializar seus dados para algo fácil de ler e entender como JSON, mas com mais compactação e desempenho superior, consulte o pacote de mensagens.
fonte
JSON é melhor se você deseja fazer backup de dados e restaurá-los em uma máquina diferente ou via FTP.
Por exemplo, com serialize, se você armazenar dados em um servidor Windows, faça o download via FTP e restaure-o em um servidor Linux, pois não funcionou mais devido à recodificação de caracteres, porque serialize armazena o comprimento das strings e no Unicode > A transcodificação UTF-8 de um caractere de 1 byte pode ter 2 bytes de comprimento, causando a falha do algoritmo.
fonte
THX - para este código de referência:
Meus resultados na matriz que eu uso para configuração são os seguintes: JSON codificado em 0,0031511783599854 segundos
PHP serializado em 0,0037961006164551 segundos
json_encode()
foi aproximadamente 20,47% mais rápido queserialize()
JSON codificado em 0,0070841312408447 segundosPHP serializado em 0,0035839080810547 segundos
unserialize()
foi 97,66 % mais rápido quejson_encode()
Então - teste com seus próprios dados.
fonte
Se, para resumir o que as pessoas dizem aqui, json_decode / encode parece mais rápido que serializar / desserializar, MAS Se você fizer var_dump, o tipo do objeto serializado será alterado. Se, por algum motivo, você quiser manter o tipo, vá em serialize!
(tente por exemplo stdClass vs array)
serializar / desserializar:
json codifica / decodifica
Como você pode ver, o json_encode / decode converte tudo em stdClass, o que não é bom, as informações do objeto são perdidas ... Portanto, decida com base nas necessidades, especialmente se não forem apenas matrizes ...
fonte
Eu sugiro que você use o Super Cache, que é um mecanismo de cache de arquivos que não usará
json_encode
ouserialize
. É simples de usar e muito rápido em comparação com outro mecanismo de cache do PHP.https://packagist.org/packages/smart-php/super-cache
Ex:
fonte