Простая сериализация быстрее, чем JSON? (в рубине) - PullRequest
3 голосов
/ 19 марта 2010

У меня есть приложение, написанное на ruby ​​(которое работает на виртуальной машине JRuby). При профилировании я понял, что он тратит много времени (фактически почти все) на преобразование некоторых хешей в JSON.

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

Существует ли метод сериализации, который подходит для такого ввода и, как правило, будет работать быстрее, чем JSON? Было бы предпочтительным, если бы он также имел гем, совместимый с Java или JRuby.

В настоящее время я использую гем jruby-json, который является самой быстрой JSON реализацией в JRuby (как мне сказали), поэтому переход, скорее всего, будет к другому методу сериализации, а не просто к другой библиотеке. 1010 *

Любая помощь приветствуется! Спасибо.

Ответы [ 3 ]

6 голосов
/ 19 марта 2010

Я только что слышал об этом проекте 20 минут назад (опубликованном в новостях хакера), он имеет реализацию Ruby: http://msgpack.sourceforge.net/#GettingStarted

MessagePack - это эффективная библиотека сериализации объектов на основе двоичного кода.Это позволяет обмениваться структурированными объектами между многими языками, такими как JSON.Но в отличие от JSON, он очень быстрый и маленький.

3 голосов
/ 19 марта 2010

( Edit : теперь я понимаю, что этот ответ, вероятно, не соответствует вашим требованиям - я не думаю, что YAJL доступен для Java или JRuby. Однако я оставляю это здесь, так как YAJL сам по себе, и это может помочь будущему Гуглеру.)

Если вам нравится JSON (и у вас уже есть код, который его реализует), я настоятельно рекомендую вам взглянуть на YAJL . Также доступны привязки Ruby: YAJL-Ruby .

По моему опыту, это значительно быстрее, чем встроенный в Ruby движок JSON.

3 голосов
/ 19 марта 2010

Я не знаю, насколько отличной может быть производительность на JRuby, но в MRI я считаю, что Marshal обычно самый быстрый.

Одна статья, которую я нашел , нашла Marshal какпримерно в 3 раза быстрее, чем JSON (который сам по себе был похож на YAML), в то время как еще один указывает на разницу в 2 раза (см. первый комментарий для JSON).

Ни одно из этих условий не гарантируетчто-нибудь для вашей конкретной ситуации, конечно.Не могли бы вы попробовать каждый вариант с Benchmark?Как то так:

require 'benchmark'
# other requires as necessary
N = 100 # or whatever multiple is needed to get a sensible result
Benchmark.bm(20) do |rpt|
  rpt.report("YAML") do
    N.times do
      # perform your task using YAML
    end
  end
  rpt.report("JSON") do
    # as above for JSON
  end
  rpt.report("Marshal") do
    # as above for JSON
  end
end
...