On Tue, Mar 2, 2010 at 4:34 PM, Alexandre Bergel <alexandre@bergel.eu>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 <johnmci@smalltalkconsulting.com> Twitter: squeaker68882 Corporate Smalltalk Consulting Ltd. http:// www.smalltalkconsulting.com = = = = = ======================================================================
-- _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel http://www.bergel.eu ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project