0Pricing
Ruby Academy · Lección

Optimización de memoria

Reduzca las asignaciones

Optimización de memoria es una lección gratuita de Ruby Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Ruby Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Ruby Academy incluye 4 lecciones en total.

Por qué importa la memoria

Cada objeto que crea Ruby consume memoria y añade trabajo de recolección de basura. Menos asignaciones implican programas más rápidos y ligeros.

  • El GC se detiene para recuperar objetos
  • Las tasas altas de asignación activan más ejecuciones del GC
  • Reducir las asignaciones suele ser la mejora más importante
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"

Contar asignaciones

GC.stat expone contadores de asignaciones que puede comparar antes y después de un bloque.

  • :total_allocated_objects aumenta indefinidamente
  • Calcule la diferencia antes y después para medir una sección
def allocations
  before = GC.stat(:total_allocated_objects)
  yield
  GC.stat(:total_allocated_objects) - before
end

puts allocations { Array.new(1000) { |i| i.to_s } }

Literales de cadena congelados

Cada literal de cadena repetido asigna un objeto nuevo. Congelarlos permite que Ruby reutilice una única instancia inmutable.

  • Añada el comentario mágico al principio del archivo
  • O llame a .freeze para cada literal
# frozen_string_literal: true

s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)

Evitar asignaciones en bucles

Crear objetos dentro de bucles intensivos multiplica las asignaciones. Extraiga las constantes del bucle.

  • Cree las expresiones regulares, los arrays y las cadenas una sola vez
  • Reutilícelos en las distintas iteraciones
PATTERN = /\d+/

def count_numbers(lines)
  lines.count { |line| line.match?(PATTERN) }
end

puts count_numbers(['a1', 'bb', 'c3'])

Métodos mutadores (bang)

Los métodos sin bang devuelven objetos nuevos; los métodos bang modifican el objeto en su lugar y ahorran asignaciones.

  • map!, gsub!, sort!
  • Úselos solo cuando sea seguro modificar el original
arr = [3, 1, 2]
arr.sort!
puts arr.inspect

s = 'hello world'
s.upcase!
puts s

Símbolos frente a cadenas como claves

Los símbolos están internados: el mismo símbolo es un único objeto compartido. Úselos como claves de hashes.

  • Las claves de tipo cadena asignan una cadena nueva cada vez
  • Los símbolos ahorran memoria en búsquedas repetidas
puts :name.equal?(:name)
puts 'name'.equal?('name')

Enumeradores perezosos

Encadenar map y select crea arrays intermedios. lazy procesa los elementos de uno en uno.

  • No se asignan colecciones intermedias
  • Es ideal para secuencias grandes o infinitas
result = (1..Float::INFINITY).lazy
  .select { |n| n.even? }
  .map { |n| n * n }
  .first(5)
puts result.inspect

Transmitir en lugar de cargar

Leer un archivo completo en memoria es ineficiente. Transmítalo línea por línea.

  • each_line procesa una línea cada vez
  • El uso de memoria es constante, independientemente del tamaño del archivo
text = "line1\nline2\nline3"
text.each_line do |line|
  puts line.strip.upcase
end

Concatenación de cadenas

Construir cadenas con + dentro de un bucle asigna una cadena nueva cada vez. Use << para añadir contenido en el mismo objeto.

  • + crea un objeto nuevo
  • << modifica el búfer existente
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts buffer

Agrupación y reutilización de objetos

Reutilice los objetos costosos en lugar de volver a crearlos.

  • Almacene en caché las configuraciones analizadas o las expresiones regulares compiladas
  • Use una constante o un valor memorizado
def config
  @config ||= { host: 'localhost', port: 4567 }
end

puts config.equal?(config)

Activar GC para obtener información

Puede inspeccionar el comportamiento de GC para confirmar las mejoras.

  • GC.stat(:count) muestra cuántas ejecuciones de GC se han producido
  • Que haya menos ejecuciones después de optimizar es una buena señal
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"

Comprobación rápida

Compruebe sus conocimientos sobre optimización de memoria.

Resumen

Ha aprendido a optimizar la memoria:

  • Cuente las asignaciones con GC.stat
  • Congele los literales de cadena y reutilice los objetos
  • Prefiera los métodos bang y << para evitar objetos nuevos
  • Use símbolos como claves y enumeradores perezosos en los pipelines
  • Transmita los datos grandes en lugar de cargarlos por completo

A continuación, abordará los cuellos de botella de rendimiento más comunes.

Preguntas frecuentes

¿La lección «Optimización de memoria» es gratis?

Sí — el texto completo de «Optimización de memoria» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Ruby Academy, actualiza a CoddyKit PRO. El curso de Ruby Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Optimización de memoria»?

Reduzca las asignaciones Practicas Ruby Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Ruby Academy?

No se requiere experiencia previa. Ruby Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Optimización de memoria»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Ruby Academy?

Sí. Cada lección de Ruby Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Medición del rendimiento
  2. Herramientas de perfilado
  3. Optimización de memoria
  4. Cuellos de botella comunes
← Volver a Ruby Academy