[squeak-dev] The Inbox: System-ct.1133.mcz

Thiede, Christoph Christoph.Thiede at student.hpi.uni-potsdam.de
Tue Feb 4 14:00:22 UTC 2020


Hi Levente,


> Returning from inside a block has some extra costs. You can achieve the same thing without the overhead by returning what #ensure: returns:


Wow, thanks for the hint! I made some quick measurements and the results were surprising:

c := Object newSubclass.
c compile: 'foo ^ [2 + 3] ensure: []'.
c compile: 'bar [^ 2 + 3] ensure: []'.
o := c new.
[o foo] bench. "60 ns"
[o bar] bench. "700 ns"

What's the reason? The second version calls #methodReturnTop, why is this so expensive? From my naive understanding, one call to #findNextUnwindContextUpTo: should not be significantly slower than two calls to #resume:?
However, it's interesting ... Will patch this commit soon.

Best,
Christoph

________________________________
Von: Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org> im Auftrag von Levente Uzonyi <leves at caesar.elte.hu>
Gesendet: Dienstag, 4. Februar 2020 13:33 Uhr
An: squeak-dev at lists.squeakfoundation.org
Betreff: Re: [squeak-dev] The Inbox: System-ct.1133.mcz

Hi Christoph,

On Mon, 3 Feb 2020, commits at source.squeak.org wrote:

> Christoph Thiede uploaded a new version of System to project The Inbox:
> http://source.squeak.org/inbox/System-ct.1133.mcz
>
> ==================== Summary ====================
>
> Name: System-ct.1133
> Author: ct
> Time: 3 February 2020, 11:55:06.856675 pm
> UUID: bd5c789a-39d3-574b-aa2a-0f900b3a8009
> Ancestors: System-cmm.1131
>
> Fix execution-around pattern to forward return value in some during methods
>
> So that
>        Utilities useAuthorName: 'Squeak' during: [Utilities authorName]
> yields
>        'Squeak'
> but not
>        Utilities.
>
> =============== Diff against System-cmm.1131 ===============
>
> Item was changed:
>  ----- Method: Preferences class>>setFlag:toValue:during: (in category 'get/set - flags') -----
>  setFlag: prefSymbol toValue: aBoolean during: aBlock
>        "Set the flag to the given value for the duration of aBlock"
>
>        (self valueOfFlag: prefSymbol) in: [:previous |
>                self setFlag: prefSymbol toValue: aBoolean.
> +              ^ aBlock ensure: [self setFlag: prefSymbol toValue: previous]].!
> -              aBlock ensure: [self setFlag: prefSymbol toValue: previous]].!
>
> Item was changed:
>  ----- Method: Preferences class>>setPreference:toValue:during: (in category 'get/set') -----
>  setPreference: prefSymbol toValue: anObject during: aBlock
>
>        (self valueOfPreference: prefSymbol) in: [:previous |
>                self setPreference: prefSymbol toValue: anObject.
> +              ^ aBlock ensure: [self setPreference: prefSymbol toValue: previous]]!
> -              aBlock ensure: [self setPreference: prefSymbol toValue: previous]].!
>
> Item was changed:
>  ----- Method: Utilities class>>useAuthorInitials:during: (in category 'identification') -----
>  useAuthorInitials: temporaryAuthorInitials during: aBlock
>
>        | originalAuthorInitials |
>        originalAuthorInitials := AuthorInitials.
> +      [ AuthorInitials := temporaryAuthorInitials.
> +      ^ aBlock value ]

Returning from inside a block has some extra costs. You can achieve the
same thing without the overhead by returning what #ensure: returns:

         ^[ AuthorInitials := temporaryAuthorInitials.
         aBlock value ]


Levente

> +      [ AuthorInitials := temporaryAuthorInitials.
> +      ^ aBlock value ]


> -      [
> -              AuthorInitials := temporaryAuthorInitials.
> -              aBlock value ]
>                ensure: [ AuthorInitials := originalAuthorInitials ]
>        !
>
> Item was changed:
>  ----- Method: Utilities class>>useAuthorName:during: (in category 'identification') -----
>  useAuthorName: temporaryAuthorName during: aBlock
>
>        | originalAuthorName |
>        originalAuthorName := AuthorName.
> +      [ AuthorName := temporaryAuthorName.
> +      ^ aBlock value ]
> -      [
> -              AuthorName := temporaryAuthorName.
> -              aBlock value ]
>                ensure: [ AuthorName := originalAuthorName ]
>        !

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200204/d947ae17/attachment.html>


More information about the Squeak-dev mailing list