Na verdade, não é preciso uma alternativa
ruby/json é um pouco mais lento que oj, mas a diferença não é grande.
oj é popular por causa do desempenho, mas pode causar vários problemas.
- Um dos problemas do
oj é uma questão de segurança causada por monkey patching via Oj.mimic_JSON.
A responsabilidade do monkey patching
Oj.mimic_JSON e Oj.optimize_rails substituem implementações menos eficientes de JSON, mas podem causar problemas.
- Por exemplo, podem ignorar a opção
script_safe, deixando o sistema vulnerável a ataques XSS.
- Monkey patching deve ser feito com cuidado e precisa lidar com segurança com a evolução da API.
Instabilidade
oj foi uma das principais causas de crashes do Ruby em operações de grande escala.
oj é desenvolvido de forma muito ativa, então novos crashes acontecem com frequência.
- Havia hacks sujos na base de código do
oj em que era difícil confiar.
Trabalho de base
- A ideia é melhorar
ruby/json para alcançar um desempenho próximo ao do oj e reduzir a necessidade de monkey patching.
- Benchmarks foram configurados e um profiler em C foi usado para analisar o desempenho.
Evitando verificações duplicadas
- O desempenho foi melhorado no benchmark de
JSON.dump ao evitar verificações UTF-8 duplicadas.
- Remover o trabalho redundante entre
rb_enc_str_asciionly_p e isLegalUTF8 trouxe um ganho de desempenho de 3%.
Verificar primeiro as condições mais baratas e mais prováveis
- A otimização da condição que verifica se o buffer já foi alocado na função
fbuffer_inc_capa trouxe um ganho de desempenho de 15%.
Reduzindo o custo de configuração
- Reduzir o custo de configuração de
ruby/json melhorou bastante o desempenho em microbenchmarks.
Evitando pointer chasing
- Remover a chamada de
rb_enc_get melhorou o desempenho em 8%.
Tabela de consulta
- O uso de uma tabela de consulta melhorou em 30% o desempenho do dump de strings JSON.
Continua
- Há mais otimizações, mas elas serão abordadas no próximo artigo.
1 comentários
Comentários do Hacker News
O uso padrão do jbuilder no Rails é um dos fatores que tornam a renderização de JSON lenta
Fiquei curioso se há alguma informação sobre o tempo que a nova versão leva para fazer parse/encode do dump JSON do Twitter
O artigo sobre esse tema é muito fácil de entender e dá vontade de fazer benchmark e otimizar código Ruby
Excelente artigo e trabalho
Artigo muito interessante
Adoro o trabalho do byroot
O conselho sobre profiler em C foi excelente
O truque de performance chamado "lookup table" usado no PR do Mame foi impressionante
String#each_codepointem vez deString#each_charpode reduzir a carga no GCCompartilhou um exemplo de como melhorou ainda mais a performance na própria base de código
Array#packpara coletar code points e converter emStringEm CPUs modernas, dicas de branch prediction não são úteis
Fico curioso se o JSON do Ruby usa intrinsics