En Java, quelles sont les implications en termes de performances et de ressources de l’utilisation de
System.currentTimeMillis()
vs.
new Date()
vs.
Calendar.getInstance().getTime()
Si je comprends bien, System.currentTimeMillis()
est le plus efficace. Cependant, dans la plupart des applications, cette valeur longue devrait être convertie en une date ou en un objet similaire pour que tout ce qui a un sens pour l'homme ait un sens.
System.currentTimeMillis()
est évidemment le plus efficace car il ne crée même pas d'objet, mais new Date()
n'est en réalité qu'une mince couche de un long, donc il n'est pas loin derrière. Calendar
, en revanche, est relativement lent et très complexe, car il doit faire face à une complexité considérable et à toutes les bizarreries inhérentes aux dates et aux heures (années bissextiles, heure avancée, fuseaux horaires, etc.). .
C’est généralement une bonne idée de ne traiter que des horodatages longs ou des objets Date
au sein de votre application, et d’utiliser Calendar
lorsque vous devez réellement effectuer des calculs de date/heure ou formater des dates pour les afficher sous forme de fichier. utilisateur. Si vous devez faire beaucoup de cela, utiliser Joda Time est probablement une bonne idée, pour une interface plus propre et de meilleures performances.
En regardant le JDK, le constructeur le plus proche de Calendar.getInstance()
a ceci:
public GregorianCalendar(TimeZone zone, Locale aLocale) {
super(zone, aLocale);
gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
setTimeInMillis(System.currentTimeMillis());
}
alors il fait déjà automatiquement ce que vous suggérez. Le constructeur par défaut de Date contient ceci:
public Date() {
this(System.currentTimeMillis());
}
Il n’est donc pas vraiment nécessaire d’obtenir le temps système spécifiquement à moins que vous ne vouliez faire un calcul avec celui-ci avant de créer votre objet Calendrier/Date avec celui-ci. Je dois également recommander joda-time à utiliser en remplacement des classes de calendrier/date de Java si votre objectif est de beaucoup travailler avec les calculs de date.
Si vous utilisez une date, je vous conseille vivement d'utiliser jodatime, http://joda-time.sourceforge.net/ . Utiliser System.currentTimeMillis()
pour les champs qui sont des dates semble une très mauvaise idée car vous allez vous retrouver avec beaucoup de code inutile.
La date et le calendrier sont sérieusement borkés, et le calendrier est certainement le pire rendement de tous.
Je vous conseillerais d'utiliser System.currentTimeMillis()
lorsque vous travaillez avec des millisecondes, par exemple, comme ceci
long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
J'ai essayé de vérifier sur ma machine. Mon résultat:
Calendar.getInstance (). GetTime () (* 1000000 fois) = 402ms New Date (). GetTime (); (* 1000000 fois) = 18ms System.currentTimeMillis () (* 1000000 fois) = 16ms
N'oubliez pas le GC (si vous utilisez Calendar.getInstance()
ou new Date()
)
Je préfère utiliser la valeur renvoyée par System.currentTimeMillis()
pour toutes sortes de calculs et n'utilise que Calendar
ou Date
si j'ai vraiment besoin d'afficher une valeur lue par l'homme. Cela évitera également 99% de vos bugs de l'heure d'été. :)
En fonction de votre application, vous pouvez envisager d'utiliser plutôt System.nanoTime()
.
J'ai essayé ceci:
long now = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
new Date().getTime();
}
long result = System.currentTimeMillis() - now;
System.out.println("Date(): " + result);
now = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
System.currentTimeMillis();
}
result = System.currentTimeMillis() - now;
System.out.println("currentTimeMillis(): " + result);
Et le résultat était:
Date (): 199
currentTimeMillis (): 3
System.currentTimeMillis()
est évidemment le plus rapide car il ne s'agit que d'un seul appel de méthode et aucun ramasse-miettes n'est requis.