gpt4 book ai didi

ruby - 在 Rails 中使 TimeWithZone 对象变得惰性

转载 作者:太空宇宙 更新时间:2023-11-03 16:55:49 25 4
gpt4 key购买 nike

如何使 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 能力。

最佳答案

这个问题让我印象深刻的是,您关注的代码是从 deserialize_from_cache(json) 中调用的。为什么 that 被如此频繁地调用?您是否可以进一步查看调用链,看看是否可以减少 json 到时间的解析量?

关于ruby - 在 Rails 中使 TimeWithZone 对象变得惰性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com