Вывести результат в формате JSON в Rails довольно просто:
Это отлично работает, если вам нужно вывести небольшое количество записей.render json: @statuses
Но что произойдет, если нам нужно отобразить 10 000 записей одновременно? Производительность существенно пострадает, а наиболее трудоемкими задачами станут сериализация JSON и операции с базой данных.
Включайте только необходимые атрибуты
Первое очевидное решение — сгенерировать 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
-
Кофеин
19 Oct, 24 -
Фаерфокс 6.0
19 Oct, 24 -
Патологическая Анатомия В Действии
19 Oct, 24 -
Карта Припяти
19 Oct, 24