2

我怎样才能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 能力。

4

1 回答 1

0

这个问题让我印象深刻的是,您关注的代码是从内部调用的deserialize_from_cache(json)。为什么经常这么叫您能否进一步查看调用链,看看是否可以减少 json-to-time 解析的数量?

于 2012-04-06T12:27:18.177 回答