Каков самый быстрый способ рендеринга json в rails
Я оптимизирую некоторые медленные транзакции в нашем Rails-приложении, и я вижу значительное время, потраченное на рендеринг представлений JSON:
Rendered welcome/index.json.rabl (490.5ms)
Completed 200 OK in 1174ms (Views: 479.6ms | ActiveRecord: 27.8ms)
Предполагая, что вызов API возвращает именно те данные, которые ему нужно вернуть, Каков самый быстрый способ визуализации JSON в рельсах?
Мы используем Rabl из-за способности легко делиться кодом, но мы не привязаны к нему.
Ответы
Ответ 1
Rabl использует multi_json
для совместимости на разных платформах и по умолчанию не использует довольно быструю библиотеку Yajl. Rabl конфигурационная документация объясняет решение:
# Gemfile
gem 'yajl-ruby', :require => "yajl"
В случае, если все еще недостаточно, достаточно изучить другой JSON-сериализатор, например oj. Вы можете также инструмент сделать рендер и посмотреть, где находится узкое место.
Ответ 2
В настоящее время oj кажется самым быстрым средством визуализации - избиение yajl (согласно oj author comparison).
Oj используется по умолчанию в последнем файле multi_json (и rails использует mutli_json по умолчанию), поэтому замена на oj должна быть такой же простой, как добавление следующего в ваш Gemfile:
# Gemfile
gem "oj"
Затем каждый раз, когда вы вызываете рендер, он теперь использует oj.
render :json => { ... } # uses multi_json which uses oj
Oj также предоставляет дополнительные специальные интерфейсы, если вы хотите еще большую производительность, но приклеивание к multi_json упрощает замену драгоценных камней в будущем.
Обратите внимание, что если у вас есть какие-либо вызовы { ... }.to_json
- они не будут обновлены для использования oj, если вы не вызываете Oj.mimic_JSON
в инициализаторе.
Ответ 3
Rails 3 использует multi_json, но использует его только для json-декодирования, а не для кодирования. Json encoding/rendering/generation использует метод ActiveSupport JSON to_json
, поэтому он всегда медленный (даже если вы используете Oj gem).
Вы можете явно визуализировать с помощью multi_json, выполнив:
render :json => MultiJson.dump(@posts)
Или вы можете попробовать драгоценный камень rails-patch-json-encode (по мне), который по умолчанию будет использовать multi_json. Это повлияет на все встроенные методы to_json
, поэтому убедитесь, что все тесты пройдены.