Я использую этот маленький кусочек кода, чтобы проверить, какой метод быстрее:Большая разница по System.currentTimeMillis()
public void test() {
long start = System.currentTimeMillis();
MyDate date = new MyDate();
int max = 5000;
for (int i = 0; i < max; i++) {
Calendar.getInstance().getTimeInMillis(); // <--
}
System.out.println("Calendar instance delay: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < max; i++) {
date.getMillis(); // <--
}
System.out.println("My date delay: " + (System.currentTimeMillis() - start));
}
Так, в принципе, я пытается сравнить производительность между Calendar.getInstance().getTimeInMillis()
и MyDate.getMillis()
(MyDate - это класс, созданный мной).
Ну, когда я запускал код, указанный выше, выход был:
Calendar instance delay: 413
My date delay: 2
НО, когда я перевернул заказ (первый под названием MyDate, и после того, как календарь), я получил:
My date delay: 247
Calendar instance delay: 119
Я попытался использовать System.nanoTime()
, но произошло то же самое: первый проверенный код - тот, который занял больше времени.
Кто-нибудь знает, почему это происходит? Или, есть ли способ точно профилировать коды без использования внешнего приложения-профилировщика (только чистый код Java)?
Спасибо.
Ну, во-первых, вы инициализируете объект даты внутри первого блока синхронизации. Во-вторых, вы можете столкнуться с GC-5000, вероятно, недостаточно вызовов. Наконец, действительно ли это проблема производительности в вашем приложении? –
Каково ваше возражение против использования профилировщика? – Torious
@PhilipWhitehouse Нет, я просто использую это для тестирования. – BloodShura