Comparativo de mercado BSON, JSON e serialização nativa em PHP

Eu estava escrevendo um serviço que permite que um modelo de dados estruturados bastante solto seja armazenado no MongoDB por meio de uma API REST e percebi um pequeno problema: como posso validar o tamanho dos dados que estão sendo inseridos e ainda permitir uma estrutura solta?

Veja, eu não queria forçar uma estrutura particular no desenvolvedor, mas o PHP não tem uma maneira de obter o “tamanho” de uma variável. Como o PHP é mal tipado, é muito difícil determinar quanta memória algo usa ou quanto espaço algo levaria para armazenar.

Depois de pesquisar e pensar um pouco, percebi que a melhor aposta para uma comparação de tamanho relativo seria serializar os dados em uma string e, em seguida, strlen()descobrir o tamanho, em bytes, dos dados a serem validados. Isso funciona especialmente bem, já que a strlen()implementação do PHP usa a função nativa C, que na verdade não conta “caracteres”, mas na verdade conta o número de “bytes” em uma string. Estranho .., mas perfeito!

Agora, para o próximo dilema … qual é o formato de serialização mais eficiente e consistente para testar o tamanho dos dados? Depois de um tempo, pensei “diabos, esses dados estão sendo armazenados no MongoDB, por que não usar seu formato de serialização nativo?”. Mas, usar bson_encode () seria eficiente?

Então, naturalmente, fiz um benchmarking . O que descobri pode ser surpreendente para alguns:

Cenário

A codificação e decodificação BSON acabaram sendo significativamente mais rápidas do que a codificação e decodificação JSON, e o formato de serialização nativo do PHP estava em algum lugar entre os dois.

Portanto, embora possa não ser uma maneira perfeita de verificar o tamanho de um dado em particular em PHP, ele faz um ótimo trabalho determinando um tamanho relativo e pelo menos certificando-se de que o usuário não está abusando do sistema tentando insira toneladas de dados.

Se você gostaria de verificar o benchmark, visualizar o código, modificá-lo ou ter alguma ideia, verifique aqui . É uma essência, então fique à vontade para garfo! 🙂