That's only a small part of the picture though, how many listeners are there per each event? And how large do you think the overhead specific to delivery guards is compared to the constraint propagation handlers? On my machine (an old 2011 MBP), the following gives throughput on the order of 300k-600k deliveries per second (very variable, due to the amount of garbage generated from copying subs, I presume) #(1 10 100 1000) collect: [ :listeners | a := Announcer new. b := Object new. "Single message send in handler" listeners timesRepeat: [a when: Announcement do: [ :a | a yourself ] for: b.]. "announcement creation overhead not included" ann := Announcement new. [a announce: ann] bench]. Cheers, Henry And with a registry tuned for delivery, yet maintaining the guards (attached)/exception/error handling properties, 900k -> 2.5M #(1 10 100 1000) collect: [ :listeners | a := Announcer new. b := Object new. a instVarNamed: 'registry' put: DeliveringSubscriptionRegistry new. "Single message send in handler" listeners timesRepeat: [a when: Announcement do: [ :a | a yourself ] for: b.]. "announcement creation overhead not included" ann := Announcement new. [a announce: ann] bench.]. DeliveringSubscriptionRegistry.st (3K) Download Attachment signature.asc (859 bytes) Download Attachment |
2016-08-31 18:01 GMT+02:00 Henrik Johansen <[hidden email]>:
So close to 3 times the performance of entry-level celeron for laptops today (if I take the lowest of the 15" MBP of early 2011).
Thanks for the numbers. We need those to optimise what really matters :) Thierry |
In reply to this post by Thierry Goubier
Hi thierry
I think that if we would have a tool to show us the activity I'm quite sure that we would find bugs or mistaken behavior. could you send the scripts you did? Stef Le 30/8/16 à 22:36, Thierry Goubier a écrit : > Numbers for the discussion: > > No activity, empty desktop: > announcements 608/minute > subscribe add/remove 9/minute > > Activity, AltBrowser: > announcements 1109/minute > subscribe add/remove 207/minute > > Activity, Nautilus: > announcements 2488/minute > subscribe add/remove 716/minute > > Empirically the same processus in both environments: open two system > browser, in one, find the Announcer class, browse through a few of the > methods, select basicSubscribe: and ask for senders. > > Tracing done with Metalinks during one minute. > > Not exactly what I would have expected, especially the ratio subscribe > add/remove and announcements. > > Thierry > > Le 30/08/2016 à 17:36, Henrik Johansen a écrit : >> >>> On 30 Aug 2016, at 5:16 , Thierry Goubier >>> <[hidden email]> wrote: >>> >>> >>> I have the same concern with an Announcer optimized for certain use >>> cases, in the fact that the announcer creator is the one choosing >>> the 'kind of' optimisation it would target, hoping that the >>> listeners will conform to that use case... >> >> >> There simply is no silver bullet that will give unbeatable >> performance in all scenarios; and focusing on improving one facet of >> the default implementation will inevitably lead to either - the loss >> of some important property (general thread-safety if removing the >> mutex protection, ability to unsubscribe in handler if removing the >> copy operation and extending the delivery mutex protection, etc.) - >> greatly degenerated performance for another facet (like #remove for >> OC's). >> >> That said, the current implementation is very geared towards decent, >> balanced subscribe/unsubscribe performance, at the expense of >> delivery speed. I've said it before, and still think, that offering >> at least one other implementation emphasizing delivery speed over >> subscription/unsubscription performance, in the same way the original >> implementation did (and/or changing the default Announcer to switch >> between the two dynamically based on heuristics) *would* be a >> valuable addition to the general library. >> >> Cheers, Henry >> > > > |
In reply to this post by Glenn Cavarlé
> To me, Announcer is really usefull and efficient when it is used as an event > bus that can be shared between multiple objects. > For instance, it seems to be useless to use an Announcer in NewValueHolder > because it cannot be shared and it is only used internally to register > handlers and to propagate only the same event (ValueChanged) to them. What > is the gain of using a full featured Announcer in this case? I particularly like these two points and I would really like to have a confirmation because in that case this is really a place for improvements. > In Bloc the constraint is to propagate more than 2000 events/second without > to decrease fps, so we cannot afford to x4 the time to process events even > if Announcer is safer and better tested. > > Regards, > Glenn. |
In reply to this post by Denis Kudriashov
Le 31/8/16 à 11:23, Denis Kudriashov a
écrit :
Really? You lost me on that sentence. SystemAnnouncer current is shared by all the tools no?
|
In reply to this post by stepharo
Hi Stef, 2016-09-01 8:13 GMT+02:00 stepharo <[hidden email]>: Hi thierry Yes. I did some checks on Morphic and AltBrowser after getting the numbers, to see if I wasn't doing something wrong with my code. could you send the scripts you did? Later today. I don't have access now to the laptop where I did it. Thierry
|
In reply to this post by stepharo
2016-09-01 8:18 GMT+02:00 stepharo <[hidden email]>:
Yes, you are right. I forgot this big monster :). Now I look at senders of #announcer and there are many places with chain like "aSomebody announcer when:send:..." or also "aSomebody somebodyElse announcer when:send:...". So forgot my words :) |
2016-09-01 9:57 GMT+02:00 Denis Kudriashov <[hidden email]>:
But these places are definitely smell. |
In reply to this post by Thierry Goubier
Hi Stef, here is the script I use:| c1 c2 c3 n1 n2 n3 l1 l2 l3 | c1 := c2 := c3 := 0. n1 := (Announcer>>#announce:) ast. n2 := #(subscribe:do: subscribe:send:to: basicSubscribe:) collect: [ :e | (Announcer>>e) ast ]. n3 := #(unsubscribe: removeSubscription:) collect: [ :e | (Announcer>>e) ast ]. l1 := MetaLink new metaObject: [ c1 := c1 + 1 ]; selector: #value. l2 := MetaLink new metaObject: [ c2 := c2 + 1 ]; selector: #value. l3 := MetaLink new metaObject: [ c3 := c3 + 1 ]; selector: #value. [ n1 link: l1. n2 do: [ :e | e link: l2 ]. n3 do: [ :e | e link: l3 ]. (Duration minutes: 1) wait. n1 removeLink: l1. n2 do: [ :e | e removeLink: l2 ]. n3 do: [ :e | e removeLink: l3 ]. { 'announce' -> c1. 'subscribe' -> c2. 'unsubscribe' -> c3 } inspect ] forkAt: Processor userBackgroundPriority 2016-09-01 9:28 GMT+02:00 Thierry Goubier <[hidden email]>:
|
Hi Thierry. Just to mention our nice language: it could be written as:
|
In reply to this post by Thierry Goubier
> On 01 Sep 2016, at 10:21, Thierry Goubier <[hidden email]> wrote: > > Hi Stef, > > here is the script I use: > > | c1 c2 c3 n1 n2 n3 l1 l2 l3 | > c1 := c2 := c3 := 0. > n1 := (Announcer>>#announce:) ast. > n2 := #(subscribe:do: subscribe:send:to: basicSubscribe:) collect: [ :e | (Announcer>>e) ast ]. > n3 := #(unsubscribe: removeSubscription:) collect: [ :e | (Announcer>>e) ast ]. > l1 := MetaLink new metaObject: [ c1 := c1 + 1 ]; selector: #value. > l2 := MetaLink new metaObject: [ c2 := c2 + 1 ]; selector: #value. > l3 := MetaLink new metaObject: [ c3 := c3 + 1 ]; selector: #value. > [ n1 link: l1. n2 do: [ :e | e link: l2 ]. n3 do: [ :e | e link: l3 ]. > (Duration minutes: 1) wait. > n1 removeLink: l1. n2 do: [ :e | e removeLink: l2 ]. n3 do: [ :e | e removeLink: l3 ]. > { 'announce' -> c1. 'subscribe' -> c2. 'unsubscribe' -> c3 } inspect ] forkAt: Processor userBackgroundPriority Well, this is really cool code ! > <image.png> > > 2016-09-01 9:28 GMT+02:00 Thierry Goubier <[hidden email]>: > Hi Stef, > > > 2016-09-01 8:13 GMT+02:00 stepharo <[hidden email]>: > Hi thierry > > I think that if we would have a tool to show us the activity I'm quite sure that we would find bugs > > or mistaken behavior. > > Yes. I did some checks on Morphic and AltBrowser after getting the numbers, to see if I wasn't > doing something wrong with my code. > > could you send the scripts you did? > > Later today. I don't have access now to the laptop where I did it. > > Thierry > > > Stef > > > Le 30/8/16 à 22:36, Thierry Goubier a écrit : > > Numbers for the discussion: > > No activity, empty desktop: > announcements 608/minute > subscribe add/remove 9/minute > > Activity, AltBrowser: > announcements 1109/minute > subscribe add/remove 207/minute > > Activity, Nautilus: > announcements 2488/minute > subscribe add/remove 716/minute > > Empirically the same processus in both environments: open two system browser, in one, find the Announcer class, browse through a few of the methods, select basicSubscribe: and ask for senders. > > Tracing done with Metalinks during one minute. > > Not exactly what I would have expected, especially the ratio subscribe add/remove and announcements. > > Thierry > > Le 30/08/2016 à 17:36, Henrik Johansen a écrit : > > On 30 Aug 2016, at 5:16 , Thierry Goubier > <[hidden email]> wrote: > > > I have the same concern with an Announcer optimized for certain use > cases, in the fact that the announcer creator is the one choosing > the 'kind of' optimisation it would target, hoping that the > listeners will conform to that use case... > > > There simply is no silver bullet that will give unbeatable > performance in all scenarios; and focusing on improving one facet of > the default implementation will inevitably lead to either - the loss > of some important property (general thread-safety if removing the > mutex protection, ability to unsubscribe in handler if removing the > copy operation and extending the delivery mutex protection, etc.) - > greatly degenerated performance for another facet (like #remove for > OC's). > > That said, the current implementation is very geared towards decent, > balanced subscribe/unsubscribe performance, at the expense of > delivery speed. I've said it before, and still think, that offering > at least one other implementation emphasizing delivery speed over > subscription/unsubscription performance, in the same way the original > implementation did (and/or changing the default Announcer to switch > between the two dynamically based on heuristics) *would* be a > valuable addition to the general library. > > Cheers, Henry > > > > > > > > |
In reply to this post by Denis Kudriashov
2016-09-01 10:29 GMT+02:00 Denis Kudriashov <[hidden email]>:
Thanks. Didn't find that one when searching through the code. Recovering the userBackgroundPriority message by code browsing and search wasn't too obvious either. Thierry |
In reply to this post by Thierry Goubier
this is really cool :) Le 1/9/16 à 10:21, Thierry Goubier a
écrit :
|
Free forum by Nabble | Edit this page |