Молниеносный Json В Ruby On Rails

Вывести результат в формате JSON в Rails довольно просто:

  
  
  
  
  
  
  
  
  
  
   

render json: @statuses

Это отлично работает, если вам нужно вывести небольшое количество записей.

Но что произойдет, если нам нужно отобразить 10 000 записей одновременно? Производительность существенно пострадает, а наиболее трудоемкими задачами станут сериализация JSON и операции с базой данных.



Молниеносный JSON в Ruby on Rails



Включайте только необходимые атрибуты

Первое очевидное решение — сгенерировать JSON только с теми атрибутами, которые нам нужны, то есть:

render json: @statuses, methods: [:latitude, :longitude, :timestamp, :virtual_odometer]

Отфильтрованный JSON даст нам прирост производительности более 20%:

default 5.940000 0.080000 6.020000 ( 6.094221) attrs 4.820000 0.010000 4.830000 ( 4.932337)



Выберите только обязательные поля

Второе решение — брать из базы не всё, а только те поля, которые нам нужны.



render json: @statuses.select([:latitude, :longitude, :timestamp, :virtual_odometer])

Это поможет нам избежать переноса огромного количества ненужных данных из базы данных в приложение и даст прирост скорости в 2 раза:

default 5.940000 0.080000 6.020000 ( 6.094221) attrs 4.820000 0.010000 4.830000 ( 4.932337) select 2.170000 0.020000 2.190000 ( 2.222277)



Не инициализируйте объекты ActiveRecord, если это возможно.

Давайте реализуем метод, который будет молниеносно возвращать массив хешей вместо объектов ActiveRecord:

def self.lightning connection.select_all(select([:latitude, :longitude, :timestamp, :virtual_odometer]).

arel).

each do |attrs| attrs.each_key do |attr| attrs[attr] = type_cast_attribute(attr, attrs) end end end

Это работает так же, как метод срывать , но возвращает массив хешей, а не массив значений одного поля.

Давайте вызовем наш новый метод в контроллере:

render json: @statuses.lightning

Использование облегченных хэшей ускоряет создание JSON еще в 2 раза:

default 5.940000 0.080000 6.020000 ( 6.094221) attrs 4.820000 0.010000 4.830000 ( 4.932337) select 2.170000 0.020000 2.190000 ( 2.222277) lightning 1.120000 0.010000 1.130000 ( 1.148763)



Используйте самый быстрый дампер JSON

В настоящее время доступно несколько библиотек JSON:
  • JSON — драгоценный JSON по умолчанию (+ расширения C, поставляется с Ruby 1.9)
  • Яджл — Еще одна библиотека JSON (от Брайана Лопеса)
  • Ой — Оптимизированный JSON (Питер Олер)
Рекомендуется использовать самый быстрый:

json 0.810000 0.020000 0.830000 ( 0.841307) yajl 0.760000 0.020000 0.780000 ( 0.809903) oj 0.640000 0.010000 0.650000 ( 0.666230)

Итак выбираем Oj dumper:

render json: Oj.dump(@statuses.lightning, mode: :compat)

Сводные результаты тест :

user system total real default 5.940000 0.080000 6.020000 ( 6.094221) attrs 4.820000 0.010000 4.830000 ( 4.932337) select 2.170000 0.020000 2.190000 ( 2.222277) lightning 1.120000 0.010000 1.130000 ( 1.148763) json 0.810000 0.020000 0.830000 ( 0.841307) yajl 0.760000 0.020000 0.780000 ( 0.809903) oj 0.640000 0.010000 0.650000 ( 0.666230)

Теги: #json #ruby #ror #yajl #oj #activerecord #ruby #ruby onrails
Вместе с данным постом часто просматривают: