Tengo una aplicación Rails 2.3.8 con una acción que extrae una gran cantidad de datos de una base de datos y la renderiza con entre 300 y 600 parciales (representando recursivamente una estructura tipo árbol). La evaluación comparativa de una solicitud me da tiempos de respuesta de aproximadamente 7 segundos.Ruby 1.9 más lento que Ruby 1.8?
Pensé que actualizar mi versión de Ruby a 1.9 desde 1.8 me daría una mejora en el rendimiento, pero como comparativo de la versión 1.9, obtengo tiempos de respuesta de unos 9 segundos (2 segundos más lento que en 1.8). Esto fue bastante sorprendente para mí.
¿Qué factores causarían que Ruby 1.9 se ejecute más lento que Ruby 1.8?
A continuación se muestra una parte del archivo de registro.
Rubí 1,8
Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (4.6ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.7ms)
Rendered family_index/descendants/_descendant (4.7ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (4.5ms)
Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (37.9ms)
Rendered family_index/surname_groups/_pedigree (3162.9ms)
Rendered shared/_headers (4.6ms)
Rendered shared/_new_messages (0.6ms)
Rendered shared/_home_logo (1.1ms)
Rendered shared/_login_box (4.0ms)
Rendered shared/_navigation (13.6ms)
Rendered shared/_flash_messages (0.8ms)
Rendered shared/_footer (1.0ms)
Rendered shared/_analytics (0.8ms)
Completed in 4552ms (View: 3352, DB: 147) | 200 OK [http://localhost/family_index/surname_groups/31]
Rubí 1,9
Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (1.9ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.4ms)
Rendered family_index/descendants/_descendant (2.0ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (1.9ms)
Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (15.1ms)
Rendered family_index/surname_groups/_pedigree (762.8ms)
Rendered shared/_headers (2.6ms)
Rendered shared/_new_messages (0.7ms)
Rendered shared/_home_logo (0.9ms)
Rendered shared/_login_box (3.6ms)
Rendered shared/_navigation (7.3ms)
Rendered shared/_flash_messages (0.7ms)
Rendered shared/_footer (0.8ms)
Rendered shared/_analytics (0.6ms)
Completed in 5736ms (View: 942, DB: 128) | 200 OK [http://localhost/family_index/surname_groups/31]
Parece que Ruby 1.9 es la prestación de los puntos de vista y el procesamiento de la base de datos más rápido, pero todavía está completando la solicitud más lento.
Rubí 1.8:
Completed in 4552ms (View: 3352, DB: 147) | 200 OK [http://localhost/family_index/surname_groups/31]
Ruby 1.9:
Completed in 5736ms (View: 942, DB: 128) | 200 OK [http://localhost/family_index/surname_groups/31]
actualización 10-26-2010
que he encontrado el cuello de botella en mi código. Viene de una línea que carga una tonelada de elementos de ActiveRecord utilizando las asociaciones cargadas de lazy-eager. El tiempo de base de datos es pequeño, pero supongo que toda la asignación de objetos está tomando un peaje. Aquí es mi asociación:
has_many :deep_branches,
:class_name => "FamilyIndex::Branch",
:include => {
:descendant => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
:children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
:children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
:children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference] # add marriages to this data
}]
}]
}]
}
Sin hacer la carga ansiosa, la acción completa tarda unos 40 segundos en completarse, por lo que usar el: incluir da un aumento de aproximadamente 10 veces el rendimiento. Todavía estoy buscando una manera de acelerar esto. Quizás el almacenamiento en caché sea la única manera de hacerlo.
dependen de su código. ¿Cuál es su código y puede decir si hay botteneck o no – shingara
En general, ruby 1.9 se ha mejorado mucho en términos de rendimiento. Creo que deberás mostrar un código. – jwueller
demasiado código para publicar, pero creo que la respuesta de sepp2k apunta a una gran parte de mis problemas de rendimiento. –