2012-04-06 6 views
2

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.

+0

Produktionsmodus – guidoism

+0

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

Antwort

0

Die Sache, die mir über diese Frage auffällt, ist, dass der Code, auf den Sie sich konzentrieren, innerhalb von deserialize_from_cache(json) aufgerufen wird. Warum wird so oft aufgerufen? Könnten Sie vielleicht weiter oben in der Aufrufkette nachsehen und herausfinden, ob Sie die Menge an JSON-zu-Zeit-Parsing reduzieren können?

Verwandte Themen