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 の能力をはるかに超えています。Time
TimeWithZone