44 votes

Quel est le moyen le plus rapide de rendre JSON dans les rails

J'optimise certaines transactions lentes dans notre application Rails et je vois beaucoup de temps 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 qu'il doit renvoyer, quel est le moyen le plus rapide de rendre JSON dans des rails?

Nous utilisons Rabl en raison de notre capacité à partager du code facilement, mais nous n'y sommes pas liés.

43voto

Gavin Brock Points 3296

Actuellement jo semble être la manière la plus rapide au convertisseur de battre yajl (selon le jo de l'auteur de comparaison).

Jo est utilisé par défaut dans les dernières multi_json (et les rails utilise mutli_json par défaut), alors la permutation pour jo devrait être aussi simple que d'ajouter les éléments suivants à votre Gemfile:

  # Gemfile
  gem "oj"

Ensuite, chaque fois que vous appelez de rendu, il va maintenant utiliser les jo.

  render :json => { ... } # uses multi_json which uses oj

Jo fournit également d'autres interfaces spécifiques, si vous voulez encore plus de performance, mais s'en tenir à multi_json facilite l'échange de pierres précieuses à l'avenir.

Notez que si vous avez des { ... }.to_json des appels - ils ne seront pas mis à niveau pour utiliser jo, sauf si vous vous appelez Oj.mimic_JSON dans un initialiseur.

15voto

lulalala Points 3895

Rails 3 utilise multi_json, mais il l'utilise seulement pour le décodage json, pas d'encodage. Encodage Json/rendu/génération utilise ActiveSupport JSON de la bibliothèque de l' to_json méthode, par conséquent, est toujours lent (même si vous avez utilise Jo gem).

Vous pouvez explicitement rendu à l'aide des multi_json en faisant:

render :json => MultiJson.dump(@posts)

Ou vous pouvez essayer de rails-patch-json-encode gem (par moi) qui va utiliser multi_json par défaut. Il aura une incidence sur tous les build- to_json méthodes, alors assurez-vous tous les tests de passe.

14voto

Ezekiel Templin Points 3046

Rabl utilise multi_json pour la compatibilité entre les plates-formes et n'utilise pas assez rapide Yajl la bibliothèque par défaut. Rabl de la documentation de la configuration explique la solution:

# Gemfile
gem 'yajl-ruby', :require => "yajl"

Dans le cas qui n'est pas encore assez performant, vous pouvez explorer les différents sérialiseur JSON comme les jo. Vous pourriez aussi instrument de rendu et de voir où le goulot d'étranglement existe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X