¿Cuál es la manera más rápida para extraer una serie de objetos anidados entre una variedad de objetos en Ruby?>

StackOverflow https://stackoverflow.com/questions/3145405

Pregunta

I tienen una serie de elementos, y cada elemento tiene una propiedad:. Imagen

Me gustaría una gran variedad de: imágenes, así que cuál es la forma más rápida y menos costosa para lograr esto. ¿Es sólo iteración sobre la matriz y empujar cada elemento en una nueva matriz, algo como esto:

images = []
elements.each {|element| images << element.image}
¿Fue útil?

Solución

Puede utilizar el Benchmark módulo para probar este tipo de cosas. Corrí @ versión de sepp2k en contra de su código original de este modo:

require 'benchmark'

class Element
  attr_accessor :image

  def initialize(image)
    @image = image
  end
end

elements = Array.new(500) {|index| Element.new(index)}

n = 10000

Benchmark.bm do |x|
  x.report do
    n.times do
      # Globalkeith's version
      image = []
      elements.each {|element| image << element.image}
    end
  end
  # sepp2k's version
  x.report { n.times do elements.map {|element| element.image} end }
end

La salida en mi máquina fue consistentemente (después de más de 3 carreras) muy cerca de este:

   user     system      total        real
2.140000   0.000000   2.140000 (  2.143290)
1.420000   0.010000   1.430000 (  1.422651)

Así que demuestra que map es significativamente más rápido que añadiendo manualmente a una matriz cuando la matriz es algo grande y la operación se realiza muchas veces.

Otros consejos

elements.map {|element| element.image}

Esto debería tener sobre el mismo rendimiento que su versión, pero es algo más breve y más idiomática.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top