web-dev-qa-db-fra.com

Quel est le moyen le plus rapide de rendre json dans rails

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.

44
John Naegle

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.

14
Ezekiel Templin

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.

43
Gavin Brock

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.

15
lulalala

Netflix a récemment publié une nouvelle bibliothèque de rendu JSON qui est censée être 25 à 40 fois plus rapide que la bibliothèque par défaut. Annonce . Code . Vous devrez créer un nouveau sérialiseur pour en profiter, mais pour les personnes touchées, cela ne semble pas être un gros obstacle.

1
David Krider