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.