web-dev-qa-db-fra.com

System.currentTimeMillis () vs. new Date () vs. Calendar.getInstance (). GetTime ()

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.

225
Vihung

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.

231
Michael Borgwardt

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.

42
Esko

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;
22
krosenvold

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

12
Puzirki

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

12
Bombe

En fonction de votre application, vous pouvez envisager d'utiliser plutôt System.nanoTime().

7
MykennaC

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

3
wiji

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.

0
Ramón