Quoted from perlinterp
for efficiency reasons, perl in fact just sets a flag, using CATCH_SET(TRUE) . The pp_require , pp_entereval and pp_entertry ops check this flag, and if true, they call docatch , which does a JMPENV_PUSH and starts a new runops level to execute the code, rather than doing it on the current loop.
So by using CATCH_SET it just moves the JMPENV_PUSH to a new runops, rather than doing it on the current loop.
But IMO the same amount of stuff has to be done in both cases, how does this make efficiency better?