私は最近、デフォルトのSimple I18nバックエンドから私のI18nのRedisバックエンドに切り替えます。翻訳を簡単に処理できるようにしましたが、すべてのページでかなりのパフォーマンスが発生したことがわかりました。RailsのI18nではRedisが遅すぎますか?
私はMBPにRails 3.2とRedis 2.6.4をインストールしたベンチマークをいくつか試してみました。私はクライアントとしてhiredis-rbを使用しています。
2つの異なるバックエンドを実行すると、かなり明確な違いになります。シンプルなバックエンドとの最初の呼び出しに短い遅延があります - 私は翻訳がメモリにロードされていると仮定 - と、その後の素晴らしいパフォーマンス:
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.143246
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.00415
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.004153
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.004056
Redisのバックエンドは常に遅いです:
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.122448
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.263564
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.232637
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.122304
なぜこれがI18nでは遅いのか、私には絶対的な意味があります。私は、コードベース全体で何十億ものI18nコールを待ち行列に入れています。
pry(main)> keys = $redis.keys[0..500]
pry(main)> Benchmark.realtime { $redis.mget keys }
=> 0.04264
しかし、私は本当に既存のI18nバックエンドのいずれかでこれを行うにはきれいな方法が表示されない:私は、フロントまで一緒にバッチそれらをすることができれば、私は良い形になるだろう。誰かがこの問題に取り組んでいますか?
EDIT
私はクリス・ヒールドの提案を取り、メモ化、単純なキャッシュバストを持つバックエンドを作成しました。要点はここまでです:
https://gist.github.com/wheeyls/5650947
私は数日のためにこれを試してみましょう、その後、宝石にそれを回します。
UPDATE
私のソリューションは現在、宝石のように提供されています:
https://github.com/wheeyls/cached_key_value_store
そして私もこの問題についてブログ:
http://about.g2crowd.com/faster-i18nredis-on-rails/
Redisサーバーは、これらのベンチマークを実行しているボックスとの関係でどこですか? – deefour
これは私のローカルマシン上で実行されました。私は明確にするために私の質問を編集します。 – Wheeyls