Gibt es eine schnelle Möglichkeit, DateTime-Instanzen zu erstellen und Minuten \ Sekunden \ Millis auf 0 zu setzen? In diesem Moment verwende ich den folgenden Code:
%Vor%Aber wenn es etwa 200.000 Mal aufgerufen wird, dateTime.with *** (0); Beansprucht viel Zeit. Wahrscheinlich gibt es mehr richtige Lösung?
Vielleicht so?
%Vor%Warum ist das schneller?
DateTime
-Konstruktor DateTime
-Konstruktor und 3 weitere Normalisierungen (teuer), jedes Mal, wenn Sie ein Datumsteil auf 0
setzen
Daher können Sie modulo wahrscheinlich nicht schlagen. Andere wiesen darauf hin, dass dies in sehr entlegenen Fällen, in denen Stunden nicht 60 Sekunden zählen (z. B. aufgrund von Schaltsekunden), zu falschen Ergebnissen führt, obwohl ich nicht weiß, wie der Unix-Zeitstempel immer auf Null gekürzt werden kann , um den Beginn einer Kalenderstunde zu erhalten (Beispiele sind willkommen).
Probieren Sie einfach den folgenden Code - es sieht wie Methode 1 (Ihr) dauert etwa 320ms auf meinem PC, vs Methode 2 (meine) 390ms, vs Methode 3 (Lukas) 15ms, vs Methode 4 (MutableDateTime) 310ms ... Nun könnte der Modulo (?) Zu falschen Ergebnissen führen.
%Vor% BEARBEITEN
Ich habe 10 Millionen Runs nach einer Aufwärmrunde von 100.000 gemacht:
3037
4068
88
2864
Die Modulo-Methode gewinnt mit großem Abstand, daher scheint es sicher zu sein, dass sie in den meisten Situationen viel besser abschneiden wird.
Versuchen Sie, ein MutableDateTime
: Ссылка zu erstellen, und rufen Sie dann toDateTime()
darauf auf
Die Methode dateTime.hourOfDay().roundFloorCopy()
sollte die Minute, Sekunde und Milli auf Null in einem einzigen Methodenaufruf runden (und ist der empfohlene Weg, wenn Leistung kein Problem ist). Es ist jedoch unwahrscheinlich, dass es schneller ist, als modulo direkt auf dem Millis aufzurufen.
Tags und Links java performance jodatime