255 votes

System.currentTimeMillis() vs new Date() vs calendrier

En Java, quelles sont les implications performances et ressources d’aide

vs.

vs.

Si je comprends bien, System.currentTimeMillis() est le plus efficace. Toutefois, dans la plupart des applications, cette valeur de type long devra être convertie en une Date ou un objet similaire à faire quelque chose de significatif pour l’homme.

261voto

Michael Borgwardt Points 181658

Système.currentTimeMillis() est à l'évidence le plus efficace car il n'a même pas créer un objet, mais new Date() est vraiment juste un wrapper fin à une longue, de sorte qu'il n'est pas loin derrière. Calendrier, d'autre part, est relativement lent et très complexe, car il doit composer avec la considérablement la complexité et toutes les bizarreries qui sont inhérents à des dates et des heures (les années bissextiles, l'heure d'été, fuseaux horaires, etc.).

C'est généralement une bonne idée de ne traiter qu'avec de longues horodateurs ou des objets Date au sein de votre application, et n'utiliser le Calendrier lorsque vous avez réellement besoin pour effectuer la date/l'heure des calculs, ou de format de dates pour les afficher à l'utilisateur. Si vous avez à faire beaucoup de ce, à l'aide de Joda Time est probablement une bonne idée, pour le nettoyeur de l'interface et de meilleures performances.

45voto

Esko Points 15578

En regardant le JDK, plus profond constructeur pour le Calendrier.getInstance() a ceci:

public GregorianCalendar(TimeZone zone, Locale aLocale) {
        super(zone, aLocale);
    gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
    setTimeInMillis(System.currentTimeMillis());
}

donc, c'est déjà fait automatiquement ce que vous suggérez. Date du constructeur constructeur par défaut tient à ceci:

public Date() {
    this(System.currentTimeMillis());
}

Donc, il n'y a vraiment pas besoin d'obtenir de système de temps spécifiquement, sauf si vous voulez faire un peu de maths avec elle avant de créer votre Calendrier/Date objet avec. Aussi je dois vous recommandons de joda-time pour l'utiliser comme remplacement pour Java propre calendrier/date de classes, si votre objectif est de travailler avec des calculs de date beaucoup.

22voto

krosenvold Points 35979

Si vous êtes en UTILISANT une date alors je conseille fortement que vous utilisez jodatime, http://joda-time.sourceforge.net/. En Utilisant Le Système.currentTimeMillis() pour les champs qui sont les dates sonne comme une très mauvaise idée parce que vous vous retrouverez avec beaucoup de code inutile.

Fois la date et le calendrier sont sérieusement complètement foireuse, et le Calendrier est certainement le moins performant de tous.

Je vous conseille d'utiliser le Système.currentTimeMillis() quand vous êtes d'exploitation avec millisecondes, par exemple comme ceci

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;

14voto

Roman Points 51

Sur ma machine, de que j’ai essayé le vérifier. Mon résultat :

 Calendrier (* 1000000 fois) = 402ms Date().getTime() nouvelle ; (* 1000000 fois) = 18ms System.currentTimeMillis() (* 1000000 fois) = 16ms 

N’oubliez pas de GC (si vous utilisez ou )

12voto

Bombe Points 34185

Je préfère utiliser la valeur retournée par pour toutes sortes de calculs et utiliser uniquement ou `` si je dois vraiment afficher une valeur qui est lue par l’homme. Vous éviterez également 99 % de vos bugs-heure d’été. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X