2012-05-16 10 views
5

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?

Respuesta

2

Como this blog post señaló, rieles obligó al JSON método de codificación to_json utilizar su propia implementación de codificación. Esto afecta a las clases base como Array, Hash e Integer.

Esto significa que multi_json y oj no se utilizan en absoluto de forma predeterminada durante la codificación json, por lo que se siente que es lenta.

Puede usar manualmente Oj para codificar como lo ha señalado @yujingz.

Como alternativa, utilizo la publicación de blog para crear a patch gem para usar MultiJson en su lugar, que debe usar Oj para codificar automáticamente.

2

No está utilizando Oj! No tendrá efecto automáticamente hasta que lo llame explícitamente. Reemplazar su JSON procesamiento original con

Oj.dump(args) 
Cuestiones relacionadas