Я заметил, что при отладке с условными точками останова выполнение значительно замедляется. Я знаю это некоторое время и теперь хотел бы понять, почему. Что именно происходит, что приводит к тому, что выполнение происходит так медленно? Я знаю, что добавляется условие, но если я сам добавлю условие, я не замедляю выполнение.
Например, скажем, у нас есть следующий код. И предположим, что мы добавляем условную точку останова a=i
. Позволяет просто установить условие для я == 10000.
public class Main {
public static void main(String[] args) {
int a = 0;
for (int i = 0; i<100000; i++) {
a = i; //put breakpoint here (if i == 10000)
}
System.out.println("Done! a=" + a);
}
}
Теперь вместо этого напишем условное выражение.
public class Main {
public static void main(String[] args) {
int a = 0;
for (int i = 0; i<100000; i++) {
if (i == 10000)
a = i; //put a NON-conditional breakpoint here
else a = i;
}
System.out.println("Done! a=" + a);
}
}
Почему время запуска обоих из них настолько резко отличается? Почему первый так медленнее?
В случае вашего удивления, я использую Oracle-JDK-8 для Linux (Ubuntu). Я получаю те же результаты с Eclipse и IntelliJ.
Результаты эксперимента
Я проверил первый случай на нескольких IDE, чтобы узнать, есть ли разница. Вот результаты
IntelliJ:
~ 9 секунд, чтобы попасть в точку останова
~ 90 секунд, чтобы завершить выполнение (включая начальные 9 секунд)
Eclipse:
~ 9 секунд, чтобы попасть в точку останова
~ 90 секунд, чтобы завершить выполнение (включая начальные 9 секунд)
Netbeans:
~ 12 секунд, чтобы попасть в точку останова
~ 190 секунд, чтобы завершить выполнение (включая начальные 12 секунд)
Итак, IntelliJ и Eclipse примерно одинаковы, но Netbeans намного медленнее.
Второй пример выполняется почти мгновенно на всех IDE, поэтому я не экспериментировал. (Но я запустил все три, чтобы увидеть, есть ли у кого-нибудь из них задержка, никто из них не сделал.)