Chỉ cần thử đoạn code dưới đây - nó trông như phương pháp 1 (của bạn) mất khoảng 320ms trên pc của tôi, vs phương pháp 2 (mỏ) 390ms , so với phương pháp 3 (Lukas's) 15ms, so với phương pháp 4 (MutableDateTime) 310ms ... Bây giờ modulo có thể (?) dẫn đến kết quả không chính xác.
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
tôi đã làm cho nó 10 triệu chạy sau khi một vòng ấm lên 100.000:
Các modulo phương thức thắng lớn lề, vì vậy nó có vẻ an toàn để nghĩ rằng nó sẽ thực hiện tốt hơn trong hầu hết các tình huống.
Không có số giây cố định trong một phút, vì vậy đôi khi điều này sẽ sai. – Dunes
Là số học, đặc biệt là tính toán Modulo nhanh hơn phương pháp 3 bộ? Ngoài ra, date.getTime(), u đã làm điều đó hai lần, do đó, 2 getters và một tính toán, là thực sự nhanh hơn 3 setters? Và kể từ khi anh ta định cư giờ là 0, không nên cũng vậy, 3600000 * 24 – Churk
@Churk: Đừng lo lắng về những điều nhỏ nhặt này. Cái đắt tiền trong phương thức 'with' là số học toàn thời gian. Lưu ý, OP không đặt giờ thành '0' –