On 2/15/06, Eric Hodel <drbrain / segment7.net> wrote: > On Feb 14, 2006, at 9:50 PM, Hal Fulton wrote: > > > Dave Cantrell wrote: > >> Eric Hodel wrote: > >>> > >>> You're going to get a performance hit setting up an exception > >>> trap this way. > >> Time for some down-South edumucation. What kind of performance hit > >> are we talking about here? And why the hit at all? > >> (I seem to recall reading somewhere once upon a time about memory > >> stack stuff, but I'm not an old-school C-programmer so I never had > >> to deal with it --- unfortunately for me...) > > > > Well, my knowledge is limited. Someone else can answer better. > > > > But look at it from a common-sense standpoint. Exceptions aren't > > magic. Everything Ruby does can be done in assembly language, it's > > just more verbose. > > > > I would think that exceptions, at the lowest level, work something > > like: > > > > if something_happened_here > > goto the_place_where_exceptions_are_caught > > > > So at the very least, catching exceptions means that you're doing > > some sort of comparison or conditional branch. And this is code > > that doesn't have to be run/generated *unless* you are catching > > exceptions. > > Yes. You get a setup/teardown of an exception handler for every > block. Right now class module and def have an implicit exception > handler built in. Adding a begin; rescue; end explicitly to blocks > gives you a very hefty penalty. That's no guarantee of similarly bad > performance with an implicit exception handler, but it still won't be > free. > > I've very rarely found myself placing an exception handler directly > inside a block so I don't think it would be worth it. > > $ cat rescue.rb > require 'benchmark' > > N = 10_000_000 > > Benchmark.bmbm do |b| > b.report 'begin' do > N.times { begin; rescue; end } > end > > b.report 'no begin' do > N.times { } > end > end > > $ ruby -v rescue.rb > ruby 1.8.4 (2005-12-24) [powerpc-darwin8.4.0] > Rehearsal -------------------------------------------- > begin 6.330000 0.060000 6.390000 ( 8.303914) > no begin 2.580000 0.010000 2.590000 ( 3.178967) > ----------------------------------- total: 8.980000sec > > user system total real > begin 6.320000 0.060000 6.380000 ( 8.597418) > no begin 2.570000 0.020000 2.590000 ( 3.526030) > > -- > Eric Hodel - drbrain / segment7.net - http://segment7.net > This implementation is HODEL-HASH-9600 compliant > > http://trackmap.robotcoop.com > > > > Sure, but couldn't the parser "flag" blocks that have the exception handler and only provide support for those cases? I do not see why we would have to pay the price on every block -- of course you have the over head when you use it. pth