2

ActiveSupport::TimeWithZone構築または遅延を高速化するにはどうすればよいですか?

Rails アプリのプロファイリングを行ったところ、CPU 時間の 3 分の 1 がこれらのTimeWithZoneオブジェクトの作成に費やされていることがわかりました。私はこれで頭がいっぱいです。一見単純な時間オブジェクトを構築するのにこれほどコストがかかる可能性があるのはどうしてでしょうか?

リクエストごとに膨大な回数実行されるコードは次のとおりです。

def deserialize_from_cache(json)
  attributes = ActiveSupport::JSON.decode(json)
  attributes.keys.to_a.each do |k|
    v = attributes[k]
    if v.is_a? Array and v.length == 2 and v[0] == 'Time'
      attributes[k] = Time.at(v[1]).in_time_zone # This is the expensive code
    end
  end
  self.allocate.init_with('attributes' => attributes)
end

単純な古いオブジェクトの構築をベンチマークしたところ、構築Timeよりも桁違いに高速であることがわかりました。TimeWithZone

puts Benchmark.measure { 200000.times { Time.at(1330367843) } }
  0.070000   0.000000   0.070000 (  0.068956)

puts Benchmark.measure { 200000.times { Time.at(1330367843).in_time_zone } }
  0.720000   0.000000   0.720000 (  0.715802)

モデルのすべての日時属性を、オブジェクトに変換されるときに使用されるまで、TimeWithZone単純な古い (そして安価な)オブジェクトである遅延オブジェクトにプログラムで置き換えるためにできることはありますか? これは私の Ruby の能力をはるかに超えています。TimeTimeWithZone

4

1 に答える 1

0

この質問について私を驚かせたのは、あなたが注目しているコードが 内から呼び出されているということですdeserialize_from_cache(json)。なぜそれが頻繁に呼び出されるのですか?呼び出しチェーンをさらに調べて、json-to-time 解析の量を減らすことができるかどうかを確認できますか?

于 2012-04-06T12:27:18.177 に答える