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

In Java, quali sono le prestazioni e di risorse implicazioni dell’utilizzo di

System.currentTimeMillis() 

vs

new Date() 

vs

Calendar.getInstance().getTime()

Da quanto ho capito, di Sistema.currentTimeMillis() è il più efficace. Tuttavia, nella maggior parte delle applicazioni, che valore avrebbe bisogno di essere convertito in una Data o qualche oggetto simile per fare qualcosa di significativo per gli esseri umani.

OriginaleL’autore Vihung | 2008-12-15

8 Replies
  1. 214

    System.currentTimeMillis() è ovviamente la più efficiente poiché non anche creare un oggetto, ma new Date() è in realtà solo un piccolo wrapper su un lungo, così non è lontano dietro. Calendar, invece, è relativamente lento e molto complesso, dal momento che ha a che fare con la notevole complessità e di tutte le stranezze che sono inerenti a date e orari (per gli anni bisestili, l’ora legale, fusi orari, etc.).

    È generalmente una buona idea per affrontare solo con una lunga timestamp o Date oggetti all’interno della vostra applicazione, e utilizzare solo Calendar quando è effettivamente necessario per eseguire la data/ora di calcoli, o per formattare le date per la loro visualizzazione per l’utente. Se devi fare un sacco di questo, utilizzando Joda Tempo è probabilmente una buona idea, per la pulizia dell’interfaccia e prestazioni migliori.

    Qual è la differenza tra il timestamp e currentMillis?
    è comunemente usato per descrivere un intero e lungo che descrive un punto nel tempo, quando interpretato come secondi o millisecondi, poiché “epoca” start”. In altre parole, currentTimeMillis() restituisce un timestamp.

    OriginaleL’autore Michael Borgwardt

  2. 38

    Guardando il JDK, intimo costruttore per Calendar.getInstance() è questo:

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

    quindi già fa automaticamente quello che suggeriscono. Data di default del costruttore detiene questo:

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

    Quindi non c’è davvero bisogno di ottenere il tempo di sistema in particolare a meno che non si voglia fare un po ‘ di matematica con esso prima di creare il tuo Calendario/Data oggetto. Inoltre raccomando joda tempo da utilizzare come ricambio per Java proprio calendario classi se il tuo scopo è quello di lavorare con i calcoli delle date molto.

    che il puntatore alla Data costruttore inchiodato! Grazie!

    OriginaleL’autore Esko

  3. 22

    Se si sta UTILIZZANDO una data, quindi mi consiglia vivamente di utilizzare jodatime, http://joda-time.sourceforge.net/. Utilizzando System.currentTimeMillis() per i campi che sono date suona come una buona idea, perché vi ritroverete con un sacco di inutili code.

    Sia la data e il calendario sono seriamente borked, e il Calendario è sicuramente il peggior performer di tutti.

    Ti consiglio di utilizzare System.currentTimeMillis(), quando si sono effettivamente operativo con millisecondi, per esempio come questo

     long start = System.currentTimeMillis();
        .... do something ...
     long elapsed = System.currentTimeMillis() -start;
    Volevo commentare questo perché il tuo esempio è esattamente una delle cose che si dovrebbe NON usare il Sistema.currentTimeMillis (); non è una monotona sorgente di clock, quindi non è possibile calcolare con precisione il tempo trascorso con esso. Se l’orologio di sistema è cambiato, mentre il codice sono i tempi di esecuzione, si otterrà strano (per esempio negativo) i risultati. Invece di utilizzare il Sistema.nanoTime(), che è monotona se sottostante sistema supporta una sorgente di clock (vedi bugs.java.com/bugdatabase/view_bug.do?bug_id=6458294 )
    Sistema.currentTimeMillis di per sé non è interessato da fuso orario. Sistema di cambio influenzerà Sistema.nanotime nello stesso modo come Sistema.currentTimeMillis

    OriginaleL’autore krosenvold

  4. 12

    Io preferisco usare il valore restituito da System.currentTimeMillis() per tutti i tipi di calcoli e Calendar o Date se ho bisogno davvero di visualizzare un valore che viene letto dagli esseri umani. Questo sarà anche evitare che il 99% del tuo legale-tempo di bug. 🙂

    OriginaleL’autore Bombe

  5. 12

    Sulla mia macchina ho provato a verificare. Il mio risultato:

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

    Non dimenticare GC (se si utilizza Calendar.getInstance() o new Date())

    chiedo se ci sarà alcuna differenza se molti thread di chiamare la stessa tra le altre elaborazioni

    OriginaleL’autore Puzirki

  6. 7

    A seconda dell’applicazione, si potrebbe voler considerare l’utilizzo di System.nanoTime() invece.

    Perché, la sua domanda era sulle risorse e prestazioni, nanoTime() utilizza più risorse
    Ne ho parlato perché è un’opzione che nessun altro ha suggerito. Il poster non ha specificato una piattaforma. SDN bug 6876279 suggerisce che currentTimeMillis() e nanoTime() lo stesso in alcune versioni di JDK. Il poster non hanno specificato la loro richiesta di precisione, per il quale la lista originale può essere inadeguato.
    In ritardo come questo può essere, tutti gli esempi in questione hanno una nozione assoluta di ciò che il tempo è eg. 1,348,770,313,071 millis dall’inizio del periodo di Unix. Il tempo che nanoTime restituisce è relativo (di solito all’inizio del programma) e sarebbe una sciocchezza se si è tentato di trasformarlo in una data.
    sì ma è possibile memorizzare currentTimeilli e nano in alcuni statica del codice all’avvio del programma, utilizzare gli scarti per ottenere una precisa nano da milli utilizzando un doppio var = currentTimeStart – nanoTimeStart + nanoTimeNow

    OriginaleL’autore MykennaC

  7. 3

    Ho provato questo:

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

    E il risultato è stato:

    Data(): 199

    currentTimeMillis(): 3

    Questo è un micro benchmark e si dovrebbe essere attenti a la fiducia che i risultati si ottengono. Hanno un occhiata a stackoverflow.com/questions/504103/….
    Questo parametro non è significativo, o meglio, mostra che il sistema operativo in Java non importa. Ho eseguito lo stesso benchmark in un ciclo dozzina di volte (in movimento inizializzazione di “ora” e “risultato” out of the loop), e ho dovuto carino differenze ad ogni esecuzione: Data() : 322 330; currentTimeMillis(): 319 a 322. Su alcune altre piste mi aveva Data() : 312 per 318; currentTimeMillis(): 324 a 335. Così, IMHO sono abbastanza equivalenti, su casi reali (anche guardando la fonte di Data). JFYI, ho usato Java7 su Ubuntu.

    OriginaleL’autore wiji

  8. 1

    System.currentTimeMillis() è, ovviamente, il più veloce, perché è solo una chiamata di metodo e non di garbage collector è richiesto.

    La tua risposta contiene alcun valore in quanto è solo un sottoinsieme dei precedentemente approvato risposta. Si dovrebbe cercare di non rispondere in questo modo, specialmente considerando che si tratta di una molto vecchia questione con una già esistente, la qualità della risposta.
    In secondo luogo, il garbage collector non è richiesto per il breve termine, oggetti in Eden spazio comunque.

    OriginaleL’autore Ramón

Lascia un commento