我怎样才能ActiveSupport::TimeWithZone
更快地构建或懒惰?
我一直在分析我的 Rails 应用程序,我发现三分之一的 cpu 时间用于构建这些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
为普通旧(且便宜)Time
对象的惰性对象,直到它们被使用时它们变成TimeWithZone
对象?这远远超出了我的 Ruby 能力。