System.currentTimeMillis() frente a new Date() frente a Calendar.getInstance().getTime()

Resuelto Vihung asked hace 16 años • 8 respuestas

En Java, ¿cuáles son las implicaciones de rendimiento y recursos del uso?

System.currentTimeMillis() 

vs.

new Date() 

vs.

Calendar.getInstance().getTime()

Según tengo entendido, System.currentTimeMillis()es el más eficiente. Sin embargo, en la mayoría de las aplicaciones, ese valor largo debería convertirse en una Fecha o algún objeto similar para hacer algo significativo para los humanos.

Vihung avatar Dec 15 '08 18:12 Vihung
Aceptado

System.currentTimeMillis()Es obviamente el más eficiente ya que ni siquiera crea un objeto, sino que new Date()en realidad es solo una envoltura delgada de aproximadamente un largo, por lo que no se queda atrás. Calendar, por otro lado, es relativamente lento y muy complejo, ya que tiene que lidiar con la considerable complejidad y todas las rarezas inherentes a las fechas y horas (años bisiestos, horario de verano, zonas horarias, etc.).

Generalmente es una buena idea tratar solo con marcas de tiempo u Dateobjetos largos dentro de su aplicación, y usarlos solo Calendarcuando realmente necesite realizar cálculos de fecha/hora, o formatear fechas para mostrárselas al usuario. Si tiene que hacer mucho de esto, usar Joda Time probablemente sea una buena idea, para una interfaz más limpia y un mejor rendimiento.

Michael Borgwardt avatar Dec 15 '2008 11:12 Michael Borgwardt

Mirando el JDK, el constructor más interno tiene Calendar.getInstance()esto:

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

entonces ya automáticamente hace lo que sugieres. El constructor predeterminado de Date contiene esto:

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

Por lo tanto, realmente no es necesario obtener la hora del sistema específicamente a menos que desee hacer algunos cálculos con ella antes de crear su objeto Calendario/Fecha con ella. También tengo que recomendar joda-time para usarlo como reemplazo de las clases de calendario/fecha propias de Java si su propósito es trabajar mucho con cálculos de fechas.

Esko avatar Dec 15 '2008 11:12 Esko

Si está UTILIZANDO una fecha, le recomiendo encarecidamente que utilice jodatime, http://joda-time.sourceforge.net/ . Usar System.currentTimeMillis()campos que son fechas parece una muy mala idea porque terminarás con una gran cantidad de código inútil.

Tanto la fecha como el calendario están muy complicados, y Calendar es definitivamente el que tiene peor desempeño de todos.

Le recomendaría que lo use System.currentTimeMillis()cuando esté operando con milisegundos, por ejemplo así

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;
krosenvold avatar Dec 15 '2008 11:12 krosenvold

En mi máquina intenté comprobarlo. Mi resultado:

Calendar.getInstance().getTime() (*1000000 veces) = 402ms
nueva Fecha().getTime(); (*1000000 veces) = 18ms
System.currentTimeMillis() (*1000000 veces) = 16ms

No te olvides de GC (si usas Calendar.getInstance()o new Date())

Puzirki avatar Apr 27 '2013 08:04 Puzirki