Подтвердить что ты не робот

Каков самый быстрый способ рендеринга 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 из-за способности легко делиться кодом, но мы не привязаны к нему.

4b9b3361

Ответ 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, поэтому убедитесь, что все тесты пройдены.