variable studio getinstance java performance

studio - java date android



calendar.getInstance() o calendar.clone() (5)

Necesito hacer una copia de una fecha determinada cientos de veces (no puedo pasarla por referencia). Me pregunto cuál de las dos siguientes son mejores opciones

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

O

newTime=originalDate.clone();

El rendimiento es de la mayor preocupación aquí.

Gracias.


No puedo pasar por referencia

Seguro que no puedes. No hay tal cosa en Java. Pero me gustaría revisar el requisito. ¿Cuál es el riesgo real de que alguien modifique la Fecha si pasa la misma todo el tiempo? y puedes controlar eso? por ejemplo, marcando getTime () antes y después de cada llamada, y lanzando un RTE si cambia?


  1. Mi instinto me dice que ese clon () será más rápido.
  2. ¿Por qué no intentarlo con un punto de referencia rápido [*]?
  3. Considere usar solo el valor largo de date.getTime() , si no tiene que hacer cálculos de 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"); } }

Resultados:

Clone: 13 ms Caldendar.setTime: 317 ms

PD: No estoy seguro, si realmente necesitas un Calendar o una Date , así que siéntete libre de modificar la prueba ...

(En respuesta al comentario: para mejorar la precisión de la prueba, también puede ejecutar las pruebas individualmente, aumentar el valor de N, ...)


En Scala haría un clon () y una conversión al calendario con .asInstanceOf [Calendario] como:

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


Mi enfoque sería optar por la opción 1) y luego asegurarme de que la aplicación tenga un perfil completo para detectar cuellos de botella. Puede ser que el código anterior no sea un problema en absoluto en el rendimiento general de la aplicación al final del día.


yo usaría

newTime= (Calendar) originalDate.clone();