2012-05-16 12 views
5

Według https://www.ruby-toolbox.com/categories/JSON_Parsers, powinienem uzyskać szalone przyspieszenia podczas serializowania hashe za pomocą Oj. Zainstalowałem najnowszy klejnot, umieściłem go w moim Gemfile, uruchomiłem instalację pakietu i mogę potwierdzić, że się przyzwyczaja. How can _know_ which JSON renderer is active in my Rails 3 app? Jednak nie było absolutnie żadnego przyspieszenia w renderowaniu odpowiedzi JSON.Nie można uzyskać poprawy wydajności przy użyciu parser Oj JSON

W bibliotece odpytuję starszą bazę danych MySQL z modułem mysql Ruby. Konwertuję ciągi znaków na wartości i zwracam tablicę skrótów. To działa dobrze i zajmuje około 1,5 do 2 sekund. Powinien tu być pobrany fragment danych.

KONTROLER

@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 

BIBLIOTEKA

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 

Mój problem jest z 'render: json' części. Około 1,5 MB danych może zająć około 8 lub 9 sekund. W przypadku większych zestawów danych (3,5 - 4 MB), może to zająć 25 lub 30. Napisałem dookoła używając JSON w ogóle, zacinając ciąg wraz z "sztucznymi" separatorami w bibliotece, używając zwykłego .get z jQuery w widoku , a następnie analizowanie łańcucha w haszowanie w JS w przeglądarce. Zajmuję 1,4 sekundy na mniejszych setach i 5 sekund na większych.

Podejście JSON jest czyste i zrozumiałe i jest zgodne z tym, jak zaprojektowano działania. Podejście oparte na łańcuchach to brudny hack i nie podoba mi się to, ale jest SZEŚĆ razy szybszy. Fascynującą rzeczą, której nauczyłem się przy porównywaniu obu podejść, jest to, że "serializacja" mojego hacky string do JSON jest równie szybka jak "renderowanie" tekstu (jako że naprawdę nic nie trzeba robić). Intensywna część tego procesu jest serializacją hash, ale jest to dokładnie taka rzecz, jakiej oczekiwałbym od "szybszej" biblioteki JSON, żeby zrobić lepiej.

Czy zasadniczo nie rozumiem, co Oj powinien robić dla mnie, czy robię coś złego?

Odpowiedz

2

this blog post Jak podkreślił, Szyny zmusił json metodę kodowania to_json stosować własną implementację kodowania. Wpływa to na klasy bazowe, takie jak Array, Hash i Integer.

Oznacza to, że multi_json i oj nie są domyślnie używane podczas kodowania json, dlatego czujesz, że jest wolny.

Możesz ręcznie użyć Oj do kodowania, jak wskazał @yujingz.

Alternatywnie używam wpisu na blogu, aby utworzyć a patch gem zamiast MultiJson, który powinien automatycznie używać Oj do kodowania.

2

Nie używasz Oj! Nie zacznie obowiązywać automatycznie, dopóki nie wywołasz go w sposób jawny. Zastąpić oryginalny JSON renderowania z

Oj.dump(args) 
Powiązane problemy