Melhorias e deprecações nas APIs do gem Ruby JSON

2025-08-09

Este post detalha o raciocínio e as especificidades por trás das melhorias e deprecações do mantenedor nas APIs do gem Ruby JSON. Três áreas principais são abordadas: Primeiro, a opção insegura `create_additions: true` é depreciada, sendo recomendado o uso de `JSON.unsafe_load` ou a passagem explícita da opção. Segundo, a tolerância padrão para chaves duplicadas é depreciada, sugerindo o uso de `allow_duplicate_key: true`. Por fim, embora não deprecie `Object#to_json`, uma nova API `JSON::Coder` é introduzida, oferecendo um método de serialização JSON mais seguro e flexível, abordando problemas de comportamento e configuração global. O autor enfatiza a necessidade de pesar os custos e benefícios da depreciação de APIs e destaca que as novas APIs melhoram a segurança e reduzem o risco de erros.

Leia mais
Desenvolvimento

Desbloqueando o Desempenho do Ruby Ractor: Eliminando Contenção de Variáveis de Classe

2025-05-28

Esta publicação investiga um gargalo de desempenho nos Ractors do Ruby ao lidar com variáveis de instância de classe. O bloqueio global do interpretador causa uma degradação significativa do desempenho quando vários Ractors acessam concorrentemente essas variáveis. O autor analisa meticulosamente a implementação subjacente das variáveis de instância de classe e propõe uma solução usando delegação de objetos para eliminar a contenção de bloqueio, resultando em uma melhoria de desempenho de quase três vezes em microbenchmarks. Essa solução também corrige inesperadamente um bug e uma regressão de desempenho introduzidos pelo novo recurso Namespace.

Leia mais
Desenvolvimento

Aumentando o Desempenho do Ruby Ractor: Enfrentando o Gargalo do `object_id`

2025-04-27

O modelo de concorrência Ractor do Ruby sofre de limitações de desempenho devido a bloqueios globais. Esta postagem mergulha profundamente em um gargalo de desempenho causado pelo método `object_id`, decorrente de escolhas de design históricas e melhorias na coleta de lixo. Ao otimizar a implementação do `object_id`, armazenando-o diretamente dentro dos objetos em vez de usar uma pesquisa em uma tabela hash global, o autor melhora significativamente o desempenho do Ractor, resultando em um aumento de velocidade duas vezes maior em benchmarks JSON. Embora ainda existam desafios, como o tratamento de tipos de objetos especiais, este trabalho representa um passo crucial para tornar os Ractors verdadeiramente paralelos.

Leia mais
Desenvolvimento

Melhorando os protocolos de banco de dados: uma perspectiva de experiência do desenvolvedor

2025-04-05

Este artigo discute as deficiências nos protocolos de cliente de banco de dados SQL, especificamente MySQL e PostgreSQL. O autor destaca problemas com gerenciamento de conexão, recuperação de erros e instruções preparadas, levando a um aumento na complexidade do desenvolvimento. Por exemplo, o estado de conexão mutável torna a recuperação de erros difícil, enquanto a natureza de escopo de sessão das instruções preparadas limita seu uso em pools de conexão. O autor propõe melhorias tomando emprestado do protocolo Redis, como uma fase de configuração explícita, chaves de idempotência e identificadores de instrução preparados com escopo global. Essas mudanças simplificariam os fluxos de trabalho de desenvolvimento e melhorariam a confiabilidade dos clientes de banco de dados, resultando em uma melhor experiência do desenvolvedor e bancos de dados mais amigáveis.

Leia mais
Desenvolvimento protocolo

HTTP/2: Por que não importa em servidores HTTP Ruby

2025-02-25

Este post discute a relevância do suporte HTTP/2 em servidores HTTP Ruby como o Puma. O autor argumenta que, embora a principal vantagem do HTTP/2 - multiplexação para tempos de carregamento de página mais rápidos - seja significativa na internet, ele oferece pouco benefício em uma LAN. Baixa latência e conexões de longa duração em uma LAN minimizam o impacto do slow start do TCP. Além disso, o recurso de push do servidor HTTP/2 se mostrou prejudicial e foi substituído pelo 103 Early Hints mais elegante. O autor defende deixar o tratamento do HTTP/2 para balanceadores de carga ou proxies reversos, simplificando a implantação e a manutenção para o servidor de aplicativos.

Leia mais
Desenvolvimento Desempenho de Rede

O Mito do Aplicativo Rails Limitado por E/S

2025-01-25

É comum acreditar que aplicativos Rails são inerentemente limitados por E/S, com o banco de dados sendo o principal gargalo de desempenho, tornando o desempenho do Ruby menos crítico. Esta postagem contesta essa ideia. Embora o banco de dados seja de fato um gargalo de escalabilidade, o autor argumenta que isso não significa que o aplicativo gasta a maior parte do seu tempo esperando por E/S. A análise das melhorias de desempenho do YJIT e problemas de desempenho comuns (como índices de banco de dados ausentes) sugere que muitos aplicativos Rails são na verdade limitados pela CPU. A postagem destaca a confusão entre escassez de CPU e espera de E/S, e enfatiza que a escolha do modelo de execução certo (assíncrono, com threads ou baseado em processos) depende da proporção E/S/CPU do aplicativo. O autor pede atenção ao desempenho do Ruby e aponta oportunidades de otimização no próprio Rails.

Leia mais
Desenvolvimento

Otimizando o JSON do Ruby: Uma história de alocação de pilha e inlining

2025-01-02

Esta postagem de blog, a quarta parte de uma série sobre otimização do desempenho do JSON do Ruby, detalha a jornada do autor para melhorar a velocidade de serialização JSON do Ruby. Por meio de micro-benchmarking e profiling meticulosos, o autor explora técnicas de alocação de pilha e inlining. Ao mudar a alocação de buffer do heap para a pilha e usar o inlining estrategicamente, ganhos significativos de desempenho são alcançados. No entanto, o artigo destaca a importância de equilibrar as melhorias de micro-benchmark com o desempenho de aplicativos do mundo real, mostrando um caso em que a otimização impactou negativamente conjuntos de dados maiores.

Leia mais
Desenvolvimento

Otimizando o JSON do Ruby: Parte 1

2024-12-18

Este post de blog detalha como o autor otimizou a gem `json` do Ruby para se tornar um dos analisadores e geradores JSON mais rápidos. Em vez de técnicas complexas, foram aplicadas otimizações simples com base em perfilhamento, como evitar verificações redundantes, priorizar condições mais baratas, reduzir os custos de configuração e usar tabelas de pesquisa. Essas melhorias se aplicam a códigos C e Ruby. As otimizações aumentaram significativamente o desempenho da gem `json`, tornando-a competitiva com alternativas como `oj`, reduzindo a necessidade de monkey patching e solucionando problemas de estabilidade e compatibilidade associados ao `oj`.

Leia mais
Desenvolvimento Otimização de Desempenho