2012-05-16 3 views
5

Laut https://www.ruby-toolbox.com/categories/JSON_Parsers sollte ich bei der Serialisierung von Hashes mit Oj verrückte Beschleunigungen bekommen. Ich habe das neueste Juwel installiert, es in mein Gemfile aufgenommen, installiere das Bundle und kann bestätigen, dass es verwendet wird. How can _know_ which JSON renderer is active in my Rails 3 app? Es gab jedoch keinerlei Beschleunigung beim Rendern der JSON-Antwort.Leistungsverbesserungen können mit dem Oj JSON-Parser nicht erzielt werden

In einer Bibliothek, ich eine alte MySQL-Datenbank mit Rubys mysql-Modul abfragen. Ich konvertiere Zeichenfolgen in Werte und gebe ein Array von Hashes zurück. Dies funktioniert gut und es dauert etwa 1,5 bis 2 Sekunden. Es sollte, da wird ein Stück Daten hier abgerufen werden.

CONTROLLER

@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 

BIBLIOTHEK

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 

Mein Problem ist mit dem 'Render: json' Teil. Für etwa 1,5 MB Daten kann dies etwa 8 oder 9 Sekunden dauern. Bei größeren Datasets (3.5 - 4 MB) kann es 25 oder 30 dauern. Ich habe JSON überhaupt beschrieben, indem ich eine Zeichenkette mit "künstlichen" Trennzeichen in der Bibliothek blockierte, indem ich eine einfache .get von jQuery in der Ansicht verwendete und dann die Zeichenfolge in einem Hash in JS im Browser analysieren. Ich bin bei den kleineren Sets auf 1,4 Sekunden und bei den größeren auf 5 Sekunden.

Der JSON-Ansatz ist sauber und verständlich und entspricht der Vorgehensweise. Der String-Parsing-Ansatz ist ein schmutziger Hack, und ich mag ihn nicht, aber er ist sechs Mal schneller. Das faszinierende, was ich beim Vergleich der beiden Ansätze gelernt habe, ist, dass das "Serialisieren" meiner Hacky-Zeichenfolge zu JSON genauso schnell ist wie das "Rendern" des Textes (da es nichts zu tun gibt). Der intensive Teil dieses Prozesses ist eigentlich Serialisierung ein Hash, aber das ist genau die Art von Dingen, die ich erwarten würde, eine "schnellere" JSON-Bibliothek besser zu machen.

Bin ich grundsätzlich falsch verstanden, was Oj für mich tun sollte, oder mache ich nur etwas falsch?

Antwort

2

Wie this blog post wies darauf hin, Schienen gezwungen, die json Codierverfahren to_json seine eigene Codierung Implementierung zu verwenden. Dies betrifft Basisklassen wie Array, Hash und Integer.

Dies bedeutet, dass multi_json und oj standardmäßig nicht während der JSON-Codierung verwendet werden, weshalb Sie glauben, dass es langsam ist.

Sie können Oj manuell zum Verschlüsseln verwenden, wie @yujingz darauf hingewiesen hat.

Als Alternative verwende ich den Blogpost, um a patch gem zu erstellen, stattdessen MultiJson zu verwenden, das Oj automatisch zum Codieren verwenden sollte.

2

Sie verwenden nicht Oj! Es wird nicht automatisch wirksam, bis Sie es explizit aufrufen. Ersetzen Sie Ihre ursprüngliche JSON machen mit

Oj.dump(args) 
Verwandte Themen