0Pricing
Ruby Academy · Aula

Gargalos comuns

Acelere o código Ruby.

Gargalos comuns é uma aula grátis de Ruby Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Ruby Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Ruby Academy inclui 4 aulas no total.

Reconhecendo gargalos

A maioria das lentidões em Ruby vem de alguns padrões recorrentes. Conhecê-los permite corrigir o código rapidamente.

  • Estrutura de dados inadequada para a tarefa
  • Trabalho repetido que poderia ser armazenado
  • Consultas N+1 e laços aninhados

Esta lição aborda os problemas mais comuns.

puts 'Speeding up Ruby starts with knowing the usual suspects'

Inclusão em vetores versus conjuntos

Verificar a associação com Array#include? é O(n). Um conjunto (ou tabela de dispersão) oferece consultas O(1).

  • Para verificações repetidas de associação, crie um conjunto uma vez
  • Grande ganho de velocidade em coleções grandes
require 'set'

allowed = Set.new(['a', 'b', 'c'])
puts allowed.include?('b')
puts allowed.include?('z')

Laços aninhados (O(n²))

Comparar cada par de elementos tem custo quadrático e explode com o tamanho.

  • Substitua laços internos por uma consulta em tabela de dispersão
  • Transforma O(n²) em O(n)
a = [1, 2, 3, 4]
b = [3, 4, 5]
set_b = b.to_set rescue require('set') || b.to_set
common = a.select { |x| set_b.include?(x) }
puts common.inspect

O padrão N+1

Buscar dados relacionados dentro de um laço causa operações N+1.

  • 1 consulta para a lista e depois 1 por item
  • Agrupe as consultas em vez disso, usando uma única busca agrupada
# Bad: lookup inside loop
orders = [1, 2, 3]
prices = { 1 => 10, 2 => 20, 3 => 30 }
# Good: one preloaded hash, O(1) per item
total = orders.sum { |id| prices[id] }
puts total

Memoização

Recalcular o mesmo valor custoso desperdiça tempo. Memorize-o com ||=.

  • Armazene o resultado após o primeiro cálculo
  • As chamadas seguintes retornam imediatamente
class Report
  def total
    @total ||= begin
      puts 'computing...'
      (1..1000).sum
    end
  end
end

r = Report.new
puts r.total
puts r.total

Escolhendo o método certo

Alguns métodos de enumeração são muito mais rápidos do que encadeamentos.

  • sum é melhor que inject(:+)
  • any? interrompe a busca assim que encontra um resultado, ao contrário de select.empty?
  • find para na primeira correspondência
nums = (1..1_000_000)
puts nums.any? { |n| n > 5 }
puts nums.find { |n| n > 5 }

Evitando ordenações repetidas

Ordenar dentro de um laço ou repetidamente é custoso. Ordene uma vez e reutilize.

  • Ordenar custa O(n log n)
  • Armazene o resultado ordenado se os dados forem estáveis
data = [5, 2, 8, 1, 9]
sorted = data.sort
puts sorted.first
puts sorted.last

Agrupamento em tabelas de dispersão

group_by e tally agregam em uma única passagem em vez de fazer varreduras repetidas.

  • tally conta ocorrências com eficiência
  • Evita laços manuais de contagem
words = ['a', 'b', 'a', 'c', 'b', 'a']
puts words.tally.inspect

Custo da construção de textos

Usar join é mais rápido do que a concatenação repetida para coleções.

  • Crie um vetor e depois use join uma vez
  • Evita muitos textos intermediários
parts = (1..5).map { |i| "item#{i}" }
puts parts.join(', ')

Compilação de expressões regulares

Definir um literal de expressão regular dentro de um laço intenso faz com que ele seja recompilado implicitamente. Mova-o para uma constante.

  • Compile uma vez, faça muitas correspondências
  • Use match? quando precisar apenas de um valor lógico
EMAIL = /\A[^@\s]+@[^@\s]+\z/

inputs = ['a@b.com', 'nope', 'x@y.org']
valid = inputs.select { |s| EMAIL.match?(s) }
puts valid.inspect

Adie o trabalho desnecessário

Não calcule o que talvez nunca use. Adie com avaliação preguiçosa ou verificações.

  • Retorne cedo quando possível
  • Calcule valores pesados somente sob demanda
def describe(items)
  return 'empty' if items.empty?
  "#{items.size} items, first is #{items.first}"
end

puts describe([])
puts describe([10, 20])

Verificação rápida

Teste seus conhecimentos sobre gargalos.

Recapitulação

Você aprendeu a corrigir gargalos comuns:

  • Use conjuntos ou tabelas de dispersão para associação rápida em vez de include?
  • Elimine laços aninhados e padrões N+1 com tabelas de dispersão pré-carregadas
  • Memorize cálculos custosos com ||=
  • Escolha métodos eficientes (sum, any?, tally) e mova as expressões regulares para fora
  • Adie ou ignore trabalhos dos quais talvez nunca precise

Sempre meça antes e depois para confirmar o ganho.

Perguntas Frequentes

A aula “Gargalos comuns” é grátis?

Sim — o texto completo de “Gargalos comuns” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Ruby Academy, atualize para CoddyKit PRO. O curso de Ruby Academy inclui 4 aulas no total.

O que vou aprender em “Gargalos comuns”?

Acelere o código Ruby. Você pratica Ruby Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Ruby Academy?

Nenhuma experiência prévia é necessária. Ruby Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Gargalos comuns”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Ruby Academy?

Sim. Cada aula de Ruby Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Medindo o desempenho
  2. Ferramentas de criação de perfis
  3. Otimização de memória
  4. Gargalos comuns
← Voltar para Ruby Academy