java performance date time calendar

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



performance (8)

En Java, ¿cuáles son las implicaciones de rendimiento y recursos de usar

System.currentTimeMillis()

contra

new Date()

contra

Calendar.getInstance().getTime()

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


Dependiendo de su aplicación, es posible que desee considerar el uso de System.nanoTime() lugar.


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

Calendar.getInstance().getTime() (*1000000 times) = 402ms new Date().getTime(); (*1000000 times) = 18ms System.currentTimeMillis() (*1000000 times) = 16ms

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


Intenté esto:

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

Y el resultado fue:

Fecha (): 199

currentTimeMillis (): 3


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

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

Así que ya hace automáticamente lo que sugieres. El constructor predeterminado de la fecha contiene esto:

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

Así que realmente no hay necesidad de 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 propias clases de calendario / fecha de Java si su propósito es trabajar mucho con los cálculos de fechas.


Prefiero usar el valor devuelto por System.currentTimeMillis() para todo tipo de cálculos y solo uso el Calendar o la Date si necesito mostrar realmente un valor leído por personas. Esto también evitará el 99% de sus errores de horario de verano. :)


Si está USANDO una fecha, le recomiendo encarecidamente que use jodatime, http://joda-time.sourceforge.net/ . Usar System.currentTimeMillis() para campos que son fechas suena como una muy mala idea porque terminarás con un montón de código inútil.

Tanto la fecha como el calendario están seriamente obsoletos, y el Calendario es definitivamente el peor de todos.

Le recomiendo que use System.currentTimeMillis() cuando en realidad está operando con milisegundos, por ejemplo, como este

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


System.currentTimeMillis() es obviamente el más eficiente, ya que ni siquiera crea un objeto, pero la new Date() es en realidad solo una envoltura delgada alrededor de 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 complejidad considerable y todas las rarezas inherentes a las fechas y horas (años bisiestos, ahorro de luz diurna, zonas horarias, etc.).

Por lo general, es una buena idea tratar solo con marcas de tiempo largas o objetos de Date dentro de su aplicación, y solo usar el Calendar cuando realmente necesita realizar cálculos de fecha / hora, o formatear fechas para mostrarlas al usuario. Si tiene que hacer mucho de esto, usar Joda Time es probablemente una buena idea, para una interfaz más limpia y un mejor rendimiento.


System.currentTimeMillis() es obviamente el más rápido porque es solo una llamada de método y no se requiere recolector de basura.