[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
|