De acuerdo con https://www.ruby-toolbox.com/categories/JSON_Parsers, debo obtener aceleraciones locas mientras serializo hashes usando Oj. He instalado la última joya, la he incluido en mi Gemfile, ejecuto la instalación del paquete y puedo confirmar que se está utilizando. How can _know_ which JSON renderer is active in my Rails 3 app? Sin embargo, no ha habido absolutamente ninguna aceleración en la prestación de la respuesta JSON.No se pueden obtener mejoras de rendimiento mediante el analizador OJ JSON
En una biblioteca, consulto una base de datos MySQL heredada con el módulo mysql de Ruby. Convierto cadenas a valores y devuelvo una matriz de valores hash. Esto funciona bien, y toma alrededor de 1,5 a 2 segundos. Debería, hay una gran cantidad de datos que se recuperan aquí.
CONTROLADOR
@data = Gina.points(params[:project], params[:test],
session[:username], session[:password])
respond_to do |format|
format.html { render :text => @data }
format.json { render :json => @data } # :text => MultiJson.engine
end
BIBLIOTECA
dbh = Mysql.real_connect(@@host, u, p)
res = dbh.query("SELECT * FROM #{d}.#{t}")
@data = []
res.each_hash do |row|
obj = {}
row.each_pair do |k, v|
v.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? obj[k] = v : obj[k] = v.to_f
end
@data << obj
end
Mi problema es con el 'render: json' parte. Para aproximadamente 1.5 MB de datos, esto puede tomar alrededor de 8 o 9 segundos. En conjuntos de datos más grandes (3.5 - 4 MB), puede tomar 25 o 30. He escrito todo usando JSON en absoluto al atascar una cadena junto con separadores "artificiales" en la biblioteca, usando un .get simple de jQuery en la vista , y luego analizar la cadena en un hash en JS en el navegador. Bajé a 1.4 segundos en los sets más pequeños, y 5 segundos en los más grandes.
El enfoque JSON es limpio y comprensible, y está en consonancia con la forma en que las cosas fueron diseñadas para funcionar. El enfoque de análisis de cadenas es un truco sucio, y no me gusta, pero es seis veces más rápido. Lo fascinante que he aprendido al comparar los dos enfoques es que "serializar" mi cadena hacky a JSON es tan rápido como "renderizar" el texto (ya que no hay nada que hacer, en realidad). La parte intensiva de este proceso es, de hecho, serializar un hash, pero este es exactamente el tipo de cosa que esperaría que una biblioteca JSON "más rápida" hiciera mejor.
¿Estoy fundamentalmente malentendiendo lo que Oj debería estar haciendo por mí, o simplemente estoy haciendo algo mal?