On Tue, Mar 2, 2010 at 4:34 PM, Alexandre Bergel <[email protected]>wrote:
> > Well it seems rather special purpose. What are you using it for? > > Why is the cost impacting your work? > > There is an excellent paper at oopsla'09 that shows the method call > graph can be effectively inferred using the method call stack depth: > http://www-plan.cs.colorado.edu/klipto/mytkowicz-oopsla09.pdf > > Executing "[ running sender notNil ] whileTrue: [ running := running > sender. depth := depth + 1]" before each method execution of my > application terribly slows it down. > If you did your own VM you could do something like - add a stack depth counter incremented and decremented on each call/return, voided on each non-local return, terminateTo: etc - cache it in a per-process inst var and store/restore it on process switch But this will be difficult to get right (e.g. delimited continuations, coroutines). could you cache it in various activations? e.g. something like Notification subclass: StackDepthQuery defaultAction ^nil Object methodsFor: performance monitoring cachingStackDepthDo: aBlock | home cachedStackDepth | home := thisContext. ^aBlock on: StackDepthQuery do: [:ex| ex proceedWith: (cachedStackDepth ifNil: [cachedStackDepth := self computeStackDepthFrom: home)] and then have StackDepthQuery count the stack frames as it searches for a handler. This is tricky because the exception machinery defers to ContextPart to do the search. You'd have to override a few methods. But this way you'd be able to cut short the counting adding cachingStackDepthDo:'s at suitable points until profiling showed the overhead was acceptable. > Cheers, > Alexandre > > > > > On 2010-03-02, at 4:06 PM, Alexandre Bergel wrote: > > > >> Will it be of any use for you? If yes, then I will do it. > >> > >> Alexandre > >> > >> > >> On 2 Mar 2010, at 21:00, John M McIntosh wrote: > >> > >>> Maybe you could write a plugin/primitive to do the work? > >>> > >>> On 2010-03-02, at 3:50 PM, Alexandre Bergel wrote: > >>> > >>>> Dear List, > >>>> > >>>> I was wondering whether there is a fast way to know the method call > >>>> stack depth. Something like what follows does the job: > >>>> > >>>> -=-=-=-=-=-=-=-=-=-=-=-= > >>>> | depth running | > >>>> depth := 0. > >>>> running := thisContext. > >>>> [ running sender notNil ] whileTrue: [ running := running sender. > >>>> depth := depth + 1]. > >>>> depth > >>>> -=-=-=-=-=-=-=-=-=-=-=-= > >>>> > >>>> But it is rather slow. Anyone has a suggestion? > >>>> > >>>> Cheers, > >>>> Alexandre > >>>> -- _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: > >>>> Alexandre Bergel http://www.bergel.eu > >>>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. > > > > -- > > = > > = > > = > > = > > = > > ====================================================================== > > John M. McIntosh <[email protected]> Twitter: > > squeaker68882 > > Corporate Smalltalk Consulting Ltd. http:// > > www.smalltalkconsulting.com > > = > > = > > = > > = > > = > > ====================================================================== > > > > > > > > > > -- > _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: > Alexandre Bergel http://www.bergel.eu > ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. > > > > > > > _______________________________________________ > Pharo-project mailing list > [email protected] > http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project >
_______________________________________________ Pharo-project mailing list [email protected] http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
