Ilya Grigorik ha publicado un interesante post con 6 consejos para optimizar nuestro código Ruby si utilizamos el intérprete MRI.
Minimizar las búsquedas en el AST
Si utilizamos Ruby 1.8, nuestro MRI no generará bytecode. Por ello, cada llamada a un método, cada utilización de una variable, etc., realizará una búsqueda en el Abstract Syntax Tree (AST), es decir, en una estructura en árbol que representa la sintaxis de nuestro código fuente.
Debemos, por lo tanto, tener en cuenta que abusar de la metaprogramación puede hacer que el rendimiento de nuestra aplicación se vea degradado.
Optimizar para la caché
En relación con el punto anterior, para minimizar las búsquedas en el AST, Ruby MRI mantiene una caché de las variables locales. Es decir, utilizar variables locales será más rápido:
@var = "local variable, which is cached by Ruby, and requires a single lookup" self.var = "requires walking the AST, and results in multiple lookups"
Mejor la interpolación que la concatenación
puts "This string embeds #{var1} and #{var2} through interpolation" # faster puts "This string concatenates " << var1 << " and " << var 2 # slower
Utilizar métodos destructivos
Cuando disponemos de un método no destructivo y su pareja destructiva, como gsub y gsub!, suele ser más eficiente utilizar el método destructivo. Los métodos no destructivos suelen ser más lentos ya que tienen que realizar copias de los objectos.
hash = {} hash = hash.merge({1 => 2}) # duplicates the original hash hash.merge!({1 => 2}) # equivalent to previous line, and faster
Utilizar bloques en lugar de Symbol.to_proc
@widget_ids = @widgets.map(&:id) # Symbol.to_proc method, order of magniture slower... @widget_ids = @widgets.collect {|w| w.id } # faster and simpler
Compruebalo tú mismo
Si tienes dudas sobré qué código será más rápido, es sencillo comprobarlo:
require 'benchmark' n = 100000 Benchmark.bm do |x| x.report('copy') { n.times do ; h = {}; h = h.merge({1 => 2}); end } x.report('no copy') { n.times do ; h = {}; h.merge!({1 => 2}); end } end copy 0.350000 0.060000 0.410000 ( 0.419445) no copy 0.250000 0.020000 0.270000 ( 0.276030)
![Validate my RSS feed [Valid RSS]](/wp-content/themes/javiervidal/images/valid-rss.png)
4 de Septiembre de 2008 a las 21:01
[...] - bookmarked by 1 members originally found by EAIC on 2008-08-14 6 consejos de optimización para Ruby MRI http://javiervidal.net/6-consejos-de-optimizacion-para-ruby-mri/ - bookmarked by 6 members [...]