I just set a conditional breakpoint in Eclipse’s debugger with a mildly inefficient condition by breakpoint standards – checking whether a HashMap’s value list (8 elements) contains Double.NaN. This resulted in an extremely noticeable slowdown in performance – after about five minutes, I gave up.
Then I copy pasted the condition into an if statement at the exact same line, put a noop in the if, and set a normal breakpoint there. That breakpoint was reached in the expected 20-30 seconds.
Is there something special that conditional breakpoints do that makes the performance hit worthwhile, or is Eclipse’s implementation just kinda stupid? It seems like they could fairly easily just do exactly the same thing (paste in an if and compile) behind the scenes.
Interesting!
I played with some source code to see what is happening with and without a conditional breakpoint. Attached below.
Execution in the debugger with the conditional breakpoint:
Duration: 1210623 microseconds
Execution in the debugger without the conditional breakpoint:
Duration: 24 microseconds
IMHO the VM is not stopped because the second thread continues to run side-by-side. Eclipse does have to inject the breakpoint code into the current class. Maybe it does so on every call and maybe it has to recompile the class on every call. Checking the Eclipse sources would reveal what is happening exactly.
My experience running conditional breakpoints in C# and in Visual Studio is even worse: My stomach feeling is that things are a couple of orders of magnitude worse there.