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.inspectO 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 totalMemoizaçã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.totalEscolhendo o método certo
Alguns métodos de enumeração são muito mais rápidos do que encadeamentos.
sumé melhor queinject(:+)any?interrompe a busca assim que encontra um resultado, ao contrário deselect.empty?findpara 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.lastAgrupamento em tabelas de dispersão
group_by e tally agregam em uma única passagem em vez de fazer varreduras repetidas.
tallyconta ocorrências com eficiência- Evita laços manuais de contagem
words = ['a', 'b', 'a', 'c', 'b', 'a']
puts words.tally.inspectCusto 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
joinuma 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.inspectAdie 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.