ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

RubyでJSONの変換速度を改善する

※本記事は自鯖Blogの転載です
※元記事は2013/05/01に書かれました

http://blog.parrot-studio.com/2013/05/yajl-ruby/


正直、普段はRuby標準*1のjsonを使っていれば十分なのですが、
さすがに仕事のシステムとなると、
モデルをJSONに変換するコストが問題になるケースがあります

もちろん、最初からJSONのコストが問題になったのではなく、
チューニングをかけていったらそこに行き当たった、ということなのですが、
とにかく0.1秒単位で削らないといけなかったので困りました(´-ω-)

そこで軽く調べてみたところ、こちらの情報に行き当たりました

Rails3でMultiJsonのBackendをyajlに変更してJSONのエンコード/デコードのパフォーマンスを改善する - ( ꒪⌓꒪) ゆるよろ日記

https://github.com/brianmario/yajl-ruby

この「yajl」を「yajl-ruby」経由で使うことにより、
かなりのパフォーマンス改善が見込めます(`・ω・´)

ただ、私が仕事でやっているシステムはPadrinoで、
しかもMultiJsonも使ってなかったので、
記事の通りにはできなかったのですが・・・

# Gemfile
gem 'yajl-ruby', :require => 'yajl/json_gem' 
# config/boot.rb

# bundlerの読み込みあたり

module ActiveSupport
  module JSON
    def self.encode(value, options = nil)
      hash = ActiveSupport::JSON::Encoding::Encoder.new(options).as_json(value)
      Yajl::Encoder.encode(hash)
    end
  end
end

・・・こんな感じにしました...φ(・ω・`)

「:require => 'yajl/json_gem' 」を使うと、標準json互換になる代わりに、
(おそらくは)多少パフォーマンスが犠牲になりますが、
仕事のシステムで標準から外れすぎると、後々メンテが面倒なので・・・

あと、yajl-ruby同士で送受信する場合はいいのですが、
別な環境に対して提供する場合、
標準のjsonとフォーマットが異なる場合があります*2

JSONを使うということは他システムとの連携を前提としている可能性が高く、
単純に置き換えればOKというものではないので、くれぐれもテストは慎重に
というか、使わなくていいならそれが一番いいのですが(´・ω・`) *3

*1: ただし、1.9.x以降・・・といっても、今から新しく組むならほぼ1.9系のはずですが

*2: 時刻周りの仕様が異なっていてはまりました(´-ω-)

*3: 似たような事例として、memcachedクライアントとしてdalliを最初に使おうとしたとき、非互換の部分ではまったことがあります 今なら結構な量の情報が出ているので、そこまでリスクはないと思いますが、あまり標準的ではないアーキテクチャの採用はそれ相応のリスクがある、ということで