java - tuning - calendar.getInstance() o calendar.clone()




stackify free.net profiler (4)

Non posso passare per riferimento

Di sicuro non puoi. Non esiste una cosa simile in Java. Ma vorrei rivedere il requisito. Qual è il rischio effettivo che qualcuno modifichi la data se passi sempre lo stesso? e puoi controllarlo? ad esempio controllando getTime () prima e dopo ogni chiamata e lanciando un RTE se cambia?

Ho bisogno di fare una copia di una data data centinaia di volte (non posso passare per riferimento). Mi chiedo quale dei due sotto siano le opzioni migliori

newTime=Calendar.getInstance().setTime(originalDate);

O

newTime=originalDate.clone();

Le prestazioni sono importanti qui.

grazie.


  1. Il mio istinto mi dice che il clone () sarà più veloce.
  2. Perché non provarlo con un benchmark rapido [*]?
  3. Considera di utilizzare solo il valore lungo di date.getTime() , se non è necessario eseguire calcoli del calendario.

[*]

private static final int N = 100000;

public static void main(final String[] args) throws Exception {

    final Date date = new Date();

    {
        final long start = System.currentTimeMillis();
        for (int i = 0; i < N; i ++) {
            final Date date2 = (Date) date.clone();
        }
        final long end = System.currentTimeMillis();
        System.out.println("Clone: " + (end - start) + " ms");
    }
    {
        final long start = System.currentTimeMillis();
        for (int i = 0; i < N; i ++) {
            final Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            final Date date2 = cal.getTime();
        }
        final long end = System.currentTimeMillis();
        System.out.println("Caldendar.setTime: " + (end - start) + " ms");
    }
}

risultati:

Clone: 13 ms
Caldendar.setTime: 317 ms

PS Non sono sicuro, se hai davvero bisogno di un Calendar o di un Date , quindi sentiti libero di modificare il test ...

(In risposta al commento: per migliorare la precisione del test, è anche possibile eseguire i test singolarmente, aumentare il valore di N, ...)


In Scala avrei fatto un clone () e un cast in Calendar con .asInstanceOf [Calendar] come:

val now = Calendar.getInstance()
val newDate = now.clone().asInstanceOf[Calendar]

io userei

newTime= (Calendar) originalDate.clone();






performance