<div dir="ltr">FWIW the Multiple WeakMaps approach seems to be 2X ( Chrome ) up to 3X ( FF Nightly ) faster than single WeakMap approach but I don't know how much WeakMap instances cost in terms of GC operations so this bench might be very pointless ( and surely it's premature )<div><br></div><div>Weirdly enough, Chrome Canary seems to be able to optimize the single WeakMap approach pretty well, with a gap of 1.25X faster perfs on multiple WMs.</div><div><br></div><div>the bench: <a href="http://jsperf.com/abstract-reference">http://jsperf.com/abstract-reference</a><br></div><div><br></div><div>the multiple WeakMaps approach:</div><div><br></div><div>```js</div><div><div>var PrivateCoordinatesMWM = (function () {</div><div><br></div><div>  var</div><div>    privates = {</div><div>      x: new WeakMap,</div><div>      y: new WeakMap</div><div>    }</div><div>  ;</div><div><br></div><div>  function __(self, key, value) {</div><div>    return arguments.length === 3 ?</div><div>      (privates[key].set(self, value), value) :</div><div>      privates[key].get(self);</div><div>  }</div><div><br></div><div>  function PrivateCoordinatesMWM(x, y) {</div><div>    __(this, 'x', x);</div><div>    __(this, 'y', y);</div><div>  }</div><div><br></div><div>  PrivateCoordinatesMWM.prototype.toString = function toString() {</div><div>    return ''.concat(</div><div>      '[', __(this, 'x'), 'x', __(this, 'y'), ']'</div><div>    );</div><div>  };</div><div><br></div><div>  return PrivateCoordinatesMWM;</div><div><br></div><div>}());</div></div><div>```</div><div><br></div><div>and the single WeakMap approach:</div><div><br></div><div>```js</div><div><div>var PrivateCoordinatesSWM = (function () {</div><div><br></div><div>  var privates = new WeakMap;</div><div><br></div><div>  function __(self, key, value) {</div><div>    var pvt = privates.get(self);</div><div>    if (arguments.length === 3) {</div><div>      if (!pvt) {</div><div>        privates.set(self, pvt = {});</div><div>      }</div><div>      return (pvt[key] = value);</div><div>    }</div><div>    return pvt && pvt[key];</div><div>  }</div><div><br></div><div>  function PrivateCoordinatesSWM(x, y) {</div><div>    __(this, 'x', x);</div><div>    __(this, 'y', y);</div><div>  }</div><div><br></div><div>  PrivateCoordinatesSWM.prototype.toString = function toString() {</div><div>    return ''.concat(</div><div>      '[', __(this, 'x'), 'x', __(this, 'y'), ']'</div><div>    );</div><div>  };</div><div><br></div><div>  return PrivateCoordinatesSWM;</div><div><br></div><div>}());</div></div><div>```</div><div><br></div><div>Best Regards</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 22, 2014 at 7:59 AM, Andreas Rossberg <span dir="ltr"><<a href="mailto:rossberg@google.com" target="_blank">rossberg@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 21 October 2014 22:31, Mark S. Miller <<a href="mailto:erights@google.com">erights@google.com</a>> wrote:<br>
>> in saying that [weak maps] are not designed to work efficiently in that manner.<br>
<span class="">><br>
> Actually, they are. The problem is that initial implementations date from<br>
> before we appreciated the need for the transposed representation. The best<br>
> thing TC39 can do for the future of WeakMaps is to proceed assuming the<br>
> transposed representation.<br>
<br>
</span>While I sympathise, let me clarify that this still remains a<br>
conjecture. AFAIK, nobody has proved it empirically in a JS<br>
implementation yet, we don't know in detail how complex such an<br>
implementation would be, and what side effects it might have on<br>
general performance (e.g., via added polymorphism). It's most likely<br>
not as easy or as clear a win as you may think it is.<br>
<span class="HOEnZb"><font color="#888888"><br>
/Andreas<br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div></div></blockquote></div><br></div>