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