appena provato il codice qui sotto - è sembra come metodo 1 (il vostro) dura circa 320ms sul mio pc, vs Metodo 2 (la mia) 390ms , vs method 3 (Lukas's) 15ms, vs method 4 (MutableDateTime) 310ms ... Ora il modulo potrebbe (?) portare a risultati errati.
public class Test {
private static int NUM_RUN;
public static void main(String[] args) {
Date date = new Date();
List<Runnable> list = new ArrayList<>();
list.add(method3Withs(date));
list.add(method1With(date));
list.add(methodModulo(date));
list.add(methodMutable(date));
NUM_RUN = 100_000;
for (Runnable r : list) {
long start = System.nanoTime();
r.run();
long end = System.nanoTime();
System.out.println((end - start)/1000000);
}
NUM_RUN = 10_000_000;
for (Runnable r : list) {
long start = System.nanoTime();
r.run();
long end = System.nanoTime();
System.out.println((end - start)/1000000);
}
}
private static Runnable method3Withs(final Date date) {
return new Runnable() {
@Override
public void run() {
DateTime d2 = null;
for (int i = 0; i < NUM_RUN; i++) {
d2 = new DateTime(date);
d2 = d2.withMinuteOfHour(0);
d2 = d2.withSecondOfMinute(0);
d2 = d2.withMillisOfSecond(0);
}
System.out.println(d2);
}
};
}
private static Runnable method1With(final Date date) {
return new Runnable() {
@Override
public void run() {
DateTime d2 = null;
for (int i = 0; i < NUM_RUN; i++) {
d2 = new DateTime(date);
d2 = d2.withTime(d2.getHourOfDay(), 0, 0, 0);
}
System.out.println(d2);
}
};
}
private static Runnable methodModulo(final Date date) {
return new Runnable() {
@Override
public void run() {
DateTime d2 = null;
for (int i = 0; i < NUM_RUN; i++) {
long truncatedTimestamp = date.getTime() - date.getTime() % 3600000;
d2 = new DateTime(truncatedTimestamp);
}
System.out.println(d2);
}
};
}
private static Runnable methodMutable(final Date date) {
return new Runnable() {
@Override
public void run() {
MutableDateTime m = null;
for (int i = 0; i < NUM_RUN; i++) {
m = new MutableDateTime(date);
m.setMinuteOfHour(0);
m.setSecondOfMinute(0);
m.setMillisOfSecond(0);
}
System.out.println(m);
}
};
}
}
EDIT
ho fatta 10 milioni di corse dopo un warm up giro di 100.000:
Il modulo il metodo vince di un grande margine, quindi sembra sicuro che funzionerà molto meglio nella maggior parte delle situazioni.
Non c'è un numero fisso di secondi in un minuto, quindi in alcune occasioni questo sarebbe sbagliato. – Dunes
L'aritmetica, in particolare il calcolo della Modulo, è più veloce del metodo 3 set? Inoltre, date.getTime(), lo hai fatto due volte, quindi 2 getter e un calcolo, è davvero più veloce di 3 setter? E dal momento che sta fissando le ore a 0, non dovrebbe essere anche, 3600000 * 24 – Churk
@Churk: Non preoccuparti di queste cose secondarie. Ciò che è costoso nel metodo 'with' è l'aritmetica data-ora completa. Nota, l'OP non sta impostando le ore a '0' –