Sistema.currentTimeMillis() vs new Date() vs Calendario.getInstance().getTime()


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

System.currentTimeMillis() 

Vs.

new Date() 

Vs.

Calendar.getInstance().getTime()

Como yo lo entiendo, Sistema.currentTimeMillis() es la 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.

Author: Vihung, 2008-12-15

8 answers

System.currentTimeMillis() es obviamente la más eficiente ya que ni siquiera crea un objeto, pero new Date() es realmente solo una envoltura delgada alrededor de un largo, por lo que no está muy lejos. Calendar, por otro lado, es relativamente lento y muy complejo, ya que tiene que lidiar con la considerable complejidad y todas las rarezas que son 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 largas o Date objetos dentro su aplicación, y solo use Calendar cuando realmente necesite realizar cálculos de fecha/hora, o formatear fechas para mostrarlas al usuario. Si tienes que hacer mucho de esto, usar Joda Time es probablemente una buena idea, para una interfaz más limpia y un mejor rendimiento.

 213
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-25 22:48:59

Mirando el JDK, innermost constructor para 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 usted sugiere. El constructor por defecto de Date tiene esto:

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

Así que realmente no es necesario obtener la hora del sistema específicamente a menos que desee hacer algunas matemáticas con él antes de crear su objeto de Calendario/Fecha con él. También tengo que recomendar joda-time para usar como reemplazo de las propias clases de calendario/fecha de Java si su propósito es trabajar con date cálculos mucho.

 36
Author: Esko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-01 19:16:08

Si estás USANDO una fecha, entonces te aconsejo encarecidamente que uses 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 borked, y Calendar es definitivamente el peor intérprete de todos ellos.

Te aconsejo que utilices System.currentTimeMillis() cuando realmente estás operando con milisegundos, por ejemplo así

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;
 22
Author: krosenvold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-25 22:50:17

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

 12
Author: Bombe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 11:39:59

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 se olvide de GC (si usa Calendar.getInstance() o new Date())

 12
Author: Puzirki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-27 09:13:59

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

 7
Author: MykennaC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 22:10:19

He intentado 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

 3
Author: wiji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-24 17:12:18

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

 1
Author: Ramón,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-25 22:53:27