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




stackify free.net profiler (4)

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, ...)


Il mio approccio sarebbe quello di andare per l'opzione 1) e quindi assicurarsi che l'applicazione sia accuratamente profilata per verificare i colli di bottiglia. È possibile che il codice sopra riportato non sia affatto un problema nel rendimento generale dell'applicazione alla fine della giornata.


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