Wie mache ich ActiveSupport::TimeWithZone
schneller zu konstruieren oder faul?Machen Sie TimeWithZone Objekte in Rails faul
Ich habe Profil meiner Rails App und ich habe festgestellt, dass ein Drittel der CPU-Zeit für die Konstruktion dieser TimeWithZone
Objekte ausgegeben wird. Ich bin mit meinem Verstand damit fertig. Wie ist es möglich, dass scheinbar einfache Zeitobjekte so teuer zu bauen sind?
Hier ist der Code, der eine Unmenge mal pro Anfrage ausgeführt wird:
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
I plain old Time
Objektbau gebenchmarkt und es fand schneller eine Größenordnung sein als die TimeWithZone
Konstruktion:
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)
Gibt es etwas, was ich tun kann, um alle datetime Attribute der Modelle durch faule TimeWithZone
Objekte zu ersetzen, die einfach alt (und billig) sind Time
Objekte bis sie werden verwendet, zu welcher Zeit sie in TimeWithZone
Objekte verwandelt werden? Das ist weit über meine Ruby-Fähigkeiten hinaus.
Produktionsmodus – guidoism
Ihre Benchmarks geben ziemlich unterschiedliche Ergebnisse auf meinem Laptop (Thinkpad Ubuntu 11.10 Ruby 1.9.3 p125, Rails 3.2.3). Ich sehe die Methode #at und #in_time_zone fast genau zur gleichen Zeit. Ergebnisse aus Ihrem Code: Time.at: 0,060000 0,000000 0,060000 (0,054021); Time.at.in_time_zone: 0.120000 0.000000 0.120000 (0.115737) – joelparkerhenderson