Leistungsproblem mit joda-time DateTime.with * ()

7

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?

    
Slam 03.04.2012, 11:16
quelle

5 Antworten

8

Vielleicht so?

%Vor%

Warum ist das schneller?

  • Meine Lösung verwendet die schnelle Integer-Arithmetik (vernachlässigbar) und 1 Unix-Timestamp-Normalisierung (teuer) im DateTime -Konstruktor
  • Ihre Lösung verwendet 1 Unix-Zeitstempel-Normalisierung (teuer) im DateTime -Konstruktor und 3 weitere Normalisierungen (teuer), jedes Mal, wenn Sie ein Datumsteil auf 0 setzen
  • Andere Lösungen benötigen möglicherweise weniger Codezeilen, aber wenn Sie sich JodaTime-Quellen ansehen, benötigen sie sogar mehr als 3 Normalisierungen (teuer)

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).

    
Lukas Eder 03.04.2012 11:20
quelle
5

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.

    
assylias 03.04.2012 11:31
quelle
3

Versuchen Sie, ein MutableDateTime : Ссылка zu erstellen, und rufen Sie dann toDateTime() darauf auf

    
artbristol 03.04.2012 11:28
quelle
3

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.

    
JodaStephen 03.04.2012 12:12
quelle
1

Wie wäre es mit der Methode withTime() der Klasse DateTime , so dass Sie nur einen Aufruf ausführen müssen?

%Vor%     
Jesper 03.04.2012 11:44
quelle

Tags und Links