En Java, lo que son el rendimiento y las repercusiones en los recursos de uso

System.currentTimeMillis() 

vs

new Date() 

vs

Calendar.getInstance().getTime()

Como yo lo entiendo, System.currentTimeMillis() es el más eficiente. Sin embargo, en la mayoría de las aplicaciones, que durante mucho valor tendría que ser convertidos a una Fecha o un objeto similar para hacer algo significativo para los seres humanos.

InformationsquelleAutor Vihung | 2008-12-15

8 Comentarios

  1. 231

    System.currentTimeMillis() es, obviamente, la mayoría de los eficiente ya que no incluso crear un objeto, pero new Date() en realidad es sólo una envoltura alrededor de una larga, por lo que no está muy lejos. Calendar, por otro lado, es relativamente lento y muy compleja, ya que se tiene que lidiar con la considerable complejidad y todas las rarezas que son inherentes a las fechas y los tiempos (años bisiestos, ahorro de luz del día, zonas horarias, etc.).

    Es generalmente una buena idea para ocuparse únicamente de tiempo marcas de tiempo o Date objetos dentro de la aplicación, y sólo uso Calendar cuando usted realmente necesita para realizar fecha/hora de los cálculos, o el formato de fechas para mostrarlos al usuario. Si usted tiene que hacer un montón de esto, el uso de Joda Tiempo es probablemente una buena idea, para la interfaz más limpia y de mejor rendimiento.

    • ¿Cuál es la diferencia entre la hora y currentMillis?
    • se utiliza normalmente para describir un entero largo que describe un punto en el tiempo cuando se interpreta como los segundos o milisegundos desde un «tiempo de inicio». En otras palabras, currentTimeMillis() devuelve una marca de tiempo.
  2. 42

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

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

    por lo que automáticamente hace lo que te sugieren. Fecha del constructor predeterminado sostiene que

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

    Así que no hay realmente necesita para obtener la hora del sistema, específicamente, a menos que usted quiere hacer algo de matemáticas con él antes de la creación de su Calendario/objeto Date con ella. También tengo que recomendar joda-el tiempo utilizar como un reemplazo para Java propio calendario/fecha de clases si su propósito es trabajar con los cálculos de fecha mucho.

    • ese puntero a la Fecha constructor en el clavo! Gracias!
  3. 22

    Si usted está USANDO una fecha, a continuación, le recomiendo que utilice jodatime, http://joda-time.sourceforge.net/. El uso de System.currentTimeMillis() para los campos que son fechas suena como una muy mala idea porque usted va a terminar con un montón de inútiles código.

    Tanto la fecha y el calendario están seriamente hallan roto, y el Calendario es sin duda el peor artista de todos ellos.

    Recomendamos el uso System.currentTimeMillis() cuando están en funcionamiento, con milisegundos, por ejemplo, como este

     long start = System.currentTimeMillis();
        .... do something ...
     long elapsed = System.currentTimeMillis() -start;
    • Yo quería hacer un comentario sobre esto, porque su ejemplo es exactamente una de las cosas que usted debe NO el uso del Sistema.currentTimeMillis (); que no es monotónica de la fuente de reloj, por lo que no se puede calcular de manera fiable transcurrido el tiempo con ella. Si el reloj del sistema es cambiado, mientras que el código que se temporización está en ejecución, usted recibirá extraño (por ejemplo, negativo) de los resultados. En lugar de utilizar el Sistema.nanoTime(), que está monótona si el sistema subyacente apoya una fuente de reloj (consulte bugs.java.com/bugdatabase/view_bug.do?bug_id=6458294 )
    • Sistema.currentTimeMillis sí mismo no es afectado por el tiempo de la zona. Cambiar la hora del sistema afectan el Sistema.nanotime de la misma manera como Sistema.currentTimeMillis
  4. 12

    Yo prefiero usar el valor devuelto por System.currentTimeMillis() para todo tipo de cálculos y utilizar sólo Calendar o Date si me necesita para realmente mostrar un valor que es leído por los seres humanos. Esto también evitará que el 99% de su horario de verano errores de tiempo. 🙂

  5. 12

    En mi máquina traté de comprobar. Mi resultado:

    Calendario.getInstance().getTime() (*1000000 veces) = 402ms 
    new Date().getTime(); (*1000000 veces) = 18ms 
    Sistema.currentTimeMillis() (*1000000 veces) = 16ms 
    

    No olvidarse de GC (si utiliza Calendar.getInstance() o new Date())

    • pregunto si habrá alguna diferencia si muchos hilos de llamar a la misma, entre otras procesamiento de
  6. 7

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

    • Por qué, su pregunta fue acerca de los recursos y el rendimiento, nanoTime() utiliza más recursos
    • He mencionado porque es una opción que nadie sugirió. El cartel de no especificar una plataforma. SDN error 6876279 sugiere que currentTimeMillis() y nanoTime() tomar acerca de la misma en algunas versiones de JDK. El cartel también no se especifica la precisión de las necesidades, para que la lista original puede ser inadecuado.
    • Tarde como esto puede ser, en todos los ejemplos de la pregunta tiene una noción absoluta de qué hora es, por ejemplo. 1,348,770,313,071 millis desde el inicio de la época Unix. El tiempo que nanoTime devuelve es relativa (generalmente al inicio del programa) y sería una tontería si se trató de convertirlo en una fecha.
    • sí, pero usted podría almacenar currentTimeilli y nano en algunos estático de código en el inicio del programa, a continuación, utilizar esos desplazamientos para obtener una precisa nano de milli el uso de una doble var = currentTimeStart – nanoTimeStart + nanoTimeNow
  7. 3

    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

    • Este es un micro de referencia y usted debe tener cuidado al confiar en los resultados que obtiene. Eche un vistazo a stackoverflow.com/questions/504103/….
    • Este parámetro no es significativo, o mejor, es muestra de que el sistema operativo bajo Java no importa. Me encontré con el mismo punto de referencia en un bucle docena de veces (movimiento de inicialización de «ahora» y «resultado» fuera del circuito), y tuve lindo diferencias en cada ejecución: Fecha() : 322 330; currentTimeMillis(): 319 a 322. En algunos otros se ejecuta tenía Fecha() : 312 a 318; currentTimeMillis(): 324 335. Así que, en mi humilde opinión son bastante equivalentes, en casos reales (también mirando la fuente de la Fecha). JFYI, he utilizado Java7 en Ubuntu.
  8. 0

    System.currentTimeMillis() es, obviamente, el más rápido, porque es sólo una llamada a un método y no el recolector de basura es necesario.

    • Tu respuesta no tiene valor, ya que es sólo un subconjunto de los previamente aprobados respuesta. Usted debe tratar de no responder de esta manera, sobre todo teniendo en cuenta que es una muy vieja pregunta con una ya existente, la calidad de la respuesta.
    • En segundo lugar, el recolector de basura no es necesaria para el corto plazo, los objetos en Edén, en el espacio de todos modos.

Dejar respuesta

Please enter your comment!
Please enter your name here