Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do method breakpoints impact performance so negatively?

Why does adding a method level breakpoint have such a negative impact on program performance in debug mode?

Take the following (somewhat contrived) example:

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for(int a = 0; a <Integer.MAX_VALUE; a++) {
        long v = a * a;
        if(v == 100) {
            doSomething();
        }
    }
    System.out.println("Time: " + (System.currentTimeMillis() - start) + " ms");
}

private static void doSomething() {          //*** BREAKPOINT 2
    System.out.println("done something");    //*** BREAKPOINT 1
}

The performance of this is approximately:

  • Not in debug: 4.5 seconds
  • Debug, breakpoint 1: 6.0 seconds
  • Debug, breakpoint 2: 47.0 seconds

What's going on? What benefit does the method level debug give us that normal ones can't?

Thanks!

EDIT

The timings are only approximations and include the time it takes me to react to the breakpoint and continue the application (which looks to be roughly about 1 second).

I appreciate that System.currentTimeMillis() is not 100% accurate, however the results are consistent over multiple tests and the difference in performance is massive! In fact, adding the method level breakpoint results in a warning from IntelliJ that it will have an impact on performance.

like image 949
StuPointerException Avatar asked May 14 '14 11:05

StuPointerException


1 Answers

Recently I made a research regarding Method Breakpoint Slowness issue. My conclusion was that the root issue is that Method Breakpoints are implemented by using JDPA Method Entry & Method Exit feature. This implementation requires the JVM to fire an event each time any thread enters any method and when any thread exits any method.

click here to read the entire article

like image 117
Smartik.NET Avatar answered Oct 07 '22 07:10

Smartik.NET