System.currentTimeMillis() frente a new Date() frente a Calendar.getInstance().getTime()
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.
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 Date
objetos largos dentro de su aplicación, y usarlos solo Calendar
cuando 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.
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.
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;
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()
)