rails application ruby-on-rails ruby-on-rails-3 json

ruby-on-rails - application - rails render params



¿Cuál es la forma más rápida de renderizar json en rieles? (4)

Estoy optimizando algunas transacciones lentas en nuestra aplicación Rails y veo un tiempo significativo dedicado a la representación de vistas JSON:

Rendered welcome/index.json.rabl (490.5ms) Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)

Suponiendo que la llamada a la API devuelve exactamente los datos que necesita devolver, ¿cuál es la forma más rápida de renderizar JSON en rieles?

Estamos utilizando Rabl debido a la capacidad de compartir código fácilmente, pero no estamos atados a él.


Actualmente, oj parece ser el renderizador más rápido, superando yajl (según la comparison del autor del oj).

Oj se utiliza por defecto en el último multi_json (y los rieles usan mutli_json por defecto), por lo que el intercambio a oj debe ser tan simple como agregar lo siguiente a su Gemfile:

# Gemfile gem "oj"

Luego, cada vez que llamas render, ahora usará oj.

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

Oj también proporciona interfaces específicas adicionales, si desea aún más rendimiento, pero seguir con multi_json hace que sea más fácil intercambiar gemas en el futuro.

Tenga en cuenta que si tiene alguna { ... }.to_json , estas no se actualizarán para usar oj a menos que llame a Oj.mimic_JSON en un inicializador.


Netflix lanzó recientemente una nueva biblioteca de renderizado JSON que supuestamente es 25-40 veces más rápida que la biblioteca predeterminada. Announcement Code . Tendrá que crear un nuevo Serializador para aprovecharlo, pero para las personas que se ven afectadas, eso no parece ser un gran obstáculo.


Rabl usa multi_json para la compatibilidad en todas las plataformas y no usa la biblioteca Yajl bastante rápida de forma predeterminada. La documentación de configuración de Rabl explica la solución:

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

En el caso de que todavía no sea lo suficientemente eficiente, es posible que desee explorar un serializador JSON diferente como oj . También podría instrumentar su renderizado y ver dónde existe el cuello de botella.


Rails 3 usa multi_json, pero solo lo usa para la decodificación json, no para la codificación . La codificación / representación / generación de Json utiliza el método to_json la biblioteca ActiveSupport JSON, por lo tanto, siempre es lenta (incluso si usa la gema Oj).

Puedes renderizar explícitamente usando multi_json haciendo:

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

O puede probar la gema rails-patch-json-encode (por mí) que usará multi_json por defecto. Afectará todos los métodos build-in to_json , así que asegúrese de que todas las pruebas pasen.