prostu próbowałem poniższy kod - to wygląda jak metoda 1 (Twoja) trwa około 320ms na moim komputerze, vs metoda 2 (kopalnia) 390ms , vs metoda 3 (Lukasa) 15 ms, a metoda 4 (MutableDateTime) 310ms ... Teraz modulo może (?) prowadzić do nieprawidłowych wyników.
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
zrobiłem to 10 milionów biegnie po rozgrzewki rundzie 100000:
modulo metoda wygrywa dużą margines, więc wydaje się, że bezpiecznie jest myśleć, że w większości sytuacji będzie działał znacznie lepiej.
Nie ma ustalonej liczby sekund na minutę, więc w niektórych przypadkach byłoby to nieprawidłowe. – Dunes
Czy arytmetyka, a zwłaszcza obliczenia Modulo, są szybsze od 3 metody ustawiania? Również, date.getTime(), zrobiłeś to dwa razy, więc 2 pobierające i obliczenia, czy to naprawdę jest szybsze niż 3 setery? A ponieważ on ustala godziny na 0, czy nie powinno tak być, 3600000 * 24 – Churk
@Curkur: Nie martw się o te drobne rzeczy. To, co jest drogie w metodzie 'with', to pełna arytmetyczna data i godzina. Zauważ, że OP nie ustawia godzin na '0' –