On Fri, Oct 14, 2011 at 7:24 PM, Tom Rodriguez <tom.rodrig...@oracle.com> wrote: > Are you expecting some performance penalty from doing this? Generally > speaking if you are throwing exceptions at all then you've already lost a > bunch of performance. The lookups and unwinding are probably negligible in > the general case.
Ok, that was my concern. It "felt" like the shape of a single handler that type-checks would be considerably worse than explicit catches, but as you describe below that's probably not the case. > If the exception is thrown from a callee, out of sight of the current > compilation, then the only thing that's used for deciding where to dispatch > is the exception handler table in the method. There JIT isn't even involved > in that case until the exception reaches the current nmethod. Take a look at > exception_handler_for_return_address, which finds the PC to dispatch to in > the caller frame. > > So in your case you might jump to the exception handler, do the type check > and then simply unwind as you would have before. C2 does something similar > to what you've done when dispatching exceptions. A single try with multiple > catches sends all exceptions to a single entry point in the compiled code > which then type checks them and dispatches to the right location, as you've > done. catch_inline_exceptions in doCall.cpp does this. C1 relies on the > exception handler table and dispatches them individually, with a separate > entry point for each type mentioned in a catch. For locally thrown and > caught exceptions C2 maybe convert that directly into control flow and > possibly simplify type checks along the way. C1 still goes the long route. > > So basically I would be surprised if doing what you're doing would hurt the > speed of throwing and catching exceptions by a measurable amount in real > programs. Ok, that's reassuring. Again we're also talking about performance when an exception *does* happen, which as you point out is already going to be a hit (backtrace generation, unwinding). > Where it might hurt you is with compiled code complexity, assuming that you > are spreading your try/catch over large blocks of code that might not really > need handlers. Remember that every exception handler creates extra control > flow edges which can complicate code generation. This is very hard to > quantify and may or may not matter but it seemed worth mentioning. Basically > it can increase compile time and possibly result in worse register > allocations but that's a very vague worry. > > Anyway, if you're worried abut it, I would suggested writing some test cases > that match what your usage and see if you can measure differences. There > could be pathologies here we're unaware of. I'll try to do so! There is a fair amount of code involved in these "catch anything" handlers, so that's a place I can probably improve (fast checks earlier, shunt as much logic as possible to child methods). - Charlie _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev