J'optimise certaines transactions lentes dans notre application Rails et je vois un temps considérable consacré au rendu des vues JSON:
Rendered welcome/index.json.rabl (490.5ms)
Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)
En supposant que l'appel d'API renvoie exactement les données dont il a besoin pour retourner, Quel est le moyen le plus rapide de rendre le JSON dans les rails?
Nous utilisons Rabl en raison de la possibilité de partager du code facilement, mais nous n'y sommes pas liés.
Rabl utilise multi_json
pour la compatibilité entre les plates-formes et n'utilise pas la bibliothèque Yajl assez rapide par défaut. Rabl's documentation de configuration explique la solution:
# Gemfile
gem 'yajl-Ruby', :require => "yajl"
Dans le cas où ce n'est pas encore assez performant, vous voudrez peut-être explorer un autre sérialiseur JSON comme oj . Vous pouvez également instrumenter votre rendu et voir où existe le goulot d'étranglement.
Actuellement oj semble être le moteur de rendu le plus rapide - battant yajl (selon l'auteur de l'oj comparaison ).
Oj est utilisé par défaut dans le dernier multi_json (et Rails utilise mutli_json par défaut), donc le remplacement par oj devrait être aussi simple que l'ajout de ce qui suit à votre Gemfile:
# Gemfile
gem "oj"
Ensuite, chaque fois que vous appelez render, il utilise désormais oj.
render :json => { ... } # uses multi_json which uses oj
Oj fournit également des interfaces spécifiques supplémentaires, si vous voulez encore plus de performances, mais s'en tenir à multi_json facilite à l'avenir l'échange de gemmes.
Notez que si vous avez un { ... }.to_json
appels - ceux-ci ne seront pas mis à niveau pour utiliser oj sauf si vous appelez Oj.mimic_JSON
dans un initialiseur.
Rails 3 utilise multi_json, mais il ne l'utilise que pour le décodage json, pas pour le codage . L'encodage/rendu/génération Json utilise la bibliothèque ActiveSupport JSON to_json
, est donc toujours lente (même si vous utilisez Oj gem).
Vous pouvez effectuer un rendu explicite à l'aide de multi_json en faisant:
render :json => MultiJson.dump(@posts)
Ou vous pouvez essayer Rails-patch-json-encode gem (par moi) qui utilisera multi_json par défaut. Cela affectera tous les build-in to_json
méthodes, assurez-vous donc que tous les tests réussissent.