<div dir="ltr"><div dir="ltr">Hi,</div><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">> That's better, but it still has that same fundamental problem.  Every time a developer makes a HashedCollection of a known-at-runtime size (e.g., in a variable), they're forced to choose between execution performance pain or code pain.<br>
> <br>
>     {<br>
>    '[ Dictionary new ]'->'100% of baseline rate, 27,600,000 per second. 36.2 nanoseconds per run. 11.33547 % GC time.'<br>
> <br>
>     "performance pain?"<br>
>     '[ Dictionary new: 1 ]'->'60% of baseline rate, 16,600,000 per second. 60.1 nanoseconds per run. 5.61888 % GC time.'<br>
>     '[ Dictionary new: 2 ]'->'61% of baseline rate, 16,900,000 per second. 59.2 nanoseconds per run. 5.67886 % GC time.'<br>
>     '[ Dictionary new: 3 ]'->'59% of baseline rate, 16,300,000 per second. 61.5 nanoseconds per run. 6.77864 % GC time.'<br>
<br>
Even if there's a performance overhead, you use less memory.</blockquote><div><br></div><div>But #new: is about optimization along *both* of those dimensions.  Imagine how complicated a "manpage" for #new: would have to be if it weren't.  #new: must _never_ perform significantly worse than #new (for sizes <= the default), because it would either trick or force developers into writing less-performant code, or into acknowledging Squeak's internal Dictionary implementation in their own code.  It feels like an API-design bug.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> >     "into #sizeFor:"</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
>     '[ Dictionary new: 4 ]'->'57% of baseline rate, 15,800,000 per second. 63.5 nanoseconds per run. 7.87685 % GC time.'<br>
<br>
Starting from 4, you also save time by avoiding growing, which is <br>
more significant than what you "lose" during instance creation.<br></blockquote><div><br></div><div>Except my Dictionary is never going to grow.</div><div><br></div><div>In case it helps bring clarity, my scenario is the GraphQL server.  As a Request comes in, the server will know, depending on the type,  how many named arguments to expect (for most "normal" schema's, 0 to 4, but it can define any number it wants).  So it creates right sized Dictionary to hold them all, and will never grow beyond that.  I simply don't want the server to have to do extra work when **vast majority** of requests will have fewer than 4 arguments.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
We could get rid of the anomaly by changing #new to ^self new: 3.<br></blockquote><div><br></div><div>Yes, I'd be fine with that solution, too!   For me, it's only about violation of #new:'s contract.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">If we decide to keep #new as it is, then I'm not against using a similar <br>
optimization scheme in #new:. But there should be some tests to verify <br>
that the methods always return valid dictionaries.<br>
And, I'd also prefer to swap the branches in #new: so that < 4 is the <br>
first check and < 3 is the second. There should be a comment as well <br>
about the optimization.<br></blockquote><div><br></div><div>Okay, sure thing.  I just wanted to get your initial feedback before embarking on that much work.</div><div><br></div><div>But, personally, I think default size of 3 sounds like a fine way to go.  I don't think it'd affect places currently using "Dictionary new" very much, and anywhere it did could be easily fixed...</div><div><br></div><div> - Chris</div><div><br></div></div></div>