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 uma StdClass
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ção
tempo médio: 780,2 ms; uso de memória: 41,5MB; tamanho do arquivo em cache: 3,8MB
Msgpack
O @hutch menciona o msgpack . Site bonito. Vamos tentar, não é?
tempo médio: 497 ms; uso de memória: 32MB; tamanho do arquivo em cache: 2,8MB
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.
tempo médio: 411,4 ms; uso de memória: 36,75 MB; tamanho do arquivo em cache: 3,3MB
Melhor que o pacote msg. Ainda assim, este também requer compilação.
serialize
/unserialize
tempo médio: 477,2 ms; uso de memória: 36,25MB; tamanho do arquivo em cache: 5,9MB
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:
- IgBinary é muito bom e tem um desempenho melhor que MsgPack
- Msgpack é melhor na compactação de seus dados (observe que eu não tentei a opção igbinary compact.string).
- Não quer compilar? Use padrões.
É 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
JSON_UNESCAPED_UNICODE
.