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

J’optimise certaines transactions lentes dans notre application Rails et je constate un temps important de 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 retourner, quel est le moyen le plus rapide de rendre JSON dans les rails?

Nous utilisons Rabl en raison de la possibilité de partager facilement du code, mais nous n’y sums 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. La documentation de configuration de Rabl explique la solution:

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

Dans le cas où ce n’est toujours pas assez performant, vous pouvez explorer un autre sérialiseur JSON tel que oj . Vous pouvez également instrumenter votre rendu et voir où le goulot d’étranglement existe.

Actuellement, oj semble être le moteur de rendu le plus rapide – battre yajl (selon la comparaison de l’auteur oj).

Oj est utilisé par défaut dans la dernière version de multi_json (et rails utilise mutli_json par défaut). Echanger sur oj devrait être aussi simple que d’append ce qui suit à votre Gemfile:

  # Gemfile gem "oj" 

Ensuite, chaque fois que vous appelez render, il utilisera maintenant oj.

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

Oj fournit également des interfaces spécifiques supplémentaires, si vous souhaitez encore plus de performances, mais restr fidèle à multi_json facilite l’échange de gemmes à l’avenir.

Notez que si vous avez des appels { ... }.to_json , 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 ne l’utilise que pour le décodage json, pas pour le codage . Le codage / rendu / génération Json utilise la méthode to_json la bibliothèque ActiveSupport JSON, par conséquent, elle est toujours lente (même si vous utilisez Oj Gem).

Vous pouvez rendre explicitement l’utilisation de multi_json en procédant comme suit:

 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 toutes les méthodes to_json , alors assurez-vous que tous les tests to_json .

Netflix a récemment publié une nouvelle bibliothèque de rendu JSON qui serait 25 à 40 fois plus rapide que la bibliothèque par défaut. Annonce Code Vous aurez besoin de créer un nouveau sérialiseur pour en tirer parti, mais pour les personnes touchées, cela ne semble pas être un gros problème.