Profiling y sus descubrimientos

Buenas de nuevo,

llevo puesto el gorro de stress-testing, y acabo de descubrir algo que
tal vez a los que utilizais gettext os interese (y mucho!)

Ahí lo que acabo de descubrir gracias a :
http://www.dcmanges.com/blog/rails-performance-tuning-workflow
← Recomendado!

El tema es, si utilizas gettext con un lenguaje base (pongamos el
castellano), para luego traducir al inglés, alemán, etc… peeeero el
castellano no lo traduces, ya que gettext devuelve el msgid si no
encuentra la traducción, tienes un problema de rendimiento en este
idioma (en nuestro caso, el castellano).

Mirando con el ruby-prof, descubrimos donde hace la traducción
gettext, fichero lib/gettext/textdomain.rb, método gettext(msgid):

 def gettext(msgid)
   return "" if msgid == "" or msgid.nil?
   return nil unless @current_mo
   if @current_mo[msgid] and (@current_mo[msgid].size > 0)
     @current_mo[msgid]
   elsif msgid.include?("\000")
     ret = nil
     msgid_single = msgid.split("\000")[0]
     @current_mo.each{|key, val|
       if key =~ /^#{Regexp.quote(msgid_single)}\000/
           # Usually, this is not caused to make po-files from

rgettext.
warn %Q[Warning: n_(“#{msgid_single}”,
“#{msgid.split(”\000")[1]}“) and n_(”#{key.gsub(/\000/, ‘", "’)}“) are
duplicated.] if $DEBUG
ret = val
break
end
}
ret
else
ret = nil
@current_mo.each{|key, val|
if key =~ /^#{Regexp.quote(msgid)}\000/
ret = val.split(”\000")[0]
break
end
}
ret
end
end

A partir de aqui se puede ver que si la cadena no la tienes traducida,
antes de desistir, todavia intenta buscar mediante una Regexp SOBRE
CADA MSGID de tu fichero mo, usease, si no lo tienes traducido y
tienes 1000 strings en el fichero mo, ejecuta 1000 Regexps… (!!!)
Suponiendo que en un render tengas 20 cadenas a traducir, y no tengas
ninguna traducida en el Locale correspondiente, estás ejecutando 20k
regexp / request. (Ojo al dato).

Dicho esto, los datos que tengo para un request a una pantalla
sencillita (en mi maquina pero con el environment puesto como en
production):

Con los msgid sin traducir:

boo:servifutbol isaac(production)$ while true; do curl --silent --head
–cookie “_session_id=46477c533b06eec53417433d3f4f8198”
http://localhost:3000/
| grep X-Runtime; done
X-Runtime: 0.23724
X-Runtime: 0.23574
X-Runtime: 0.23657
X-Runtime: 0.23620
X-Runtime: 0.23442
X-Runtime: 0.23484
X-Runtime: 0.23886
X-Runtime: 0.23819
X-Runtime: 0.23686
X-Runtime: 0.23568
X-Runtime: 0.23789
^C

Con los msgid traducidos:

boo:servifutbol isaac(production)$ while true; do curl --silent --head
–cookie “_session_id=46477c533b06eec53417433d3f4f8198”
http://localhost:3000/
| grep X-Runtime; done
X-Runtime: 0.08194
X-Runtime: 0.08804
X-Runtime: 0.08787
X-Runtime: 0.07829
X-Runtime: 0.07797
X-Runtime: 0.07880
X-Runtime: 0.08050
X-Runtime: 0.07714
X-Runtime: 0.08163
X-Runtime: 0.08352
X-Runtime: 0.07565
X-Runtime: 0.07446
X-Runtime: 0.07760
X-Runtime: 0.07856
X-Runtime: 0.07682
X-Runtime: 0.08380
X-Runtime: 0.08333
X-Runtime: 0.08927
^C

Da que pensar…

Todo esto con gettext 1.92.0, si alguien quiere probarlo para
corroborar mi teoria… Y si os fiais de mí, pues ya sabeis, a
traducirlo todo en gettext, incluso el idoma “por defecto”.

Salutaciones,

Isaac Feliu

La ostia … gracias.

On 24/09/2008, at 1:32, Isaac Feliu Pérez [email protected]

Muchas gracias por el aviso, Isaac! Precisamente hoy me he estado
peleando con gettext al reactivar una aplicación que tenía aparcada
desde hace unos meses y encontrarme con ese memory leak que
teníagettext 1.90.0 que hacía que los mongrels crecieran a un ritmo de 1 Mb
por petición [1]. Se soluciona actualizando, ahora estoy en la 1.93.0
y el tamaño de los mongrels se mantiene estable.

Como hoy estoy con el gorro de gettexteador probaré esto que dices y
ya os contaré mis conclusiones :slight_smile:

[1] 404-返回首页

2008/9/24 Isaac Feliu Pérez [email protected]:

castellano no lo traduces, ya que gettext devuelve el msgid si no
elsif msgid.include?(“\000”)
break
}
regexp / request. (Ojo al dato).
X-Runtime: 0.23724
^C
X-Runtime: 0.07797
X-Runtime: 0.08380
Salutaciones,


Jaime I.
http://jaimeiniesta.com
http://www.workingwithrails.com/person/6722-jaime-iniesta