<div dir="ltr">I was trying to actually use same amount of indirections, since that's probably more likely how real code might look like but you are right, hand crafting per each case the pattern we have a different winner, which is the single WeakMap instead of the multiple one.<div><br></div><div>I guess the reason is the double x/y.set and x/y.get VS only one, here the new bench:</div><div><a href="http://jsperf.com/abstract-reference/2">http://jsperf.com/abstract-reference/2</a><br></div><div><br></div><div>and here the hand crafted code:</div><div><br></div><div>```js</div><div><div>var result = [];</div><div><br></div><div>// Multiple WeakMaps approach</div><div>var PrivateCoordinatesMWM = (function () {</div><div><br></div><div>  var</div><div>    _x = new WeakMap,</div><div>    _y = new WeakMap</div><div>  ;</div><div><br></div><div>  function PrivateCoordinatesMWM(x, y) {</div><div>    _x.set(this, x);</div><div>    _y.set(this, y);</div><div>  }</div><div><br></div><div>  PrivateCoordinatesMWM.prototype.toString = function toString() {</div><div>    return ''.concat(</div><div>      '[', _x.get(this), 'x', _y.get(this), ']'</div><div>    );</div><div>  };</div><div><br></div><div>  return PrivateCoordinatesMWM;</div><div><br></div><div>}());</div><div><br></div><div>// Single WeakMap approach</div><div>var PrivateCoordinatesSWM = (function () {</div><div><br></div><div>  var _wm = new WeakMap;</div><div><br></div><div>  function PrivateCoordinatesSWM(x, y) {</div><div>    _wm.set(this, {x: x, y: y});</div><div>  }</div><div><br></div><div>  PrivateCoordinatesSWM.prototype.toString = function toString() {</div><div>    var _pvt = _wm.get(this);</div><div>    return ''.concat(</div><div>      '[', _pvt.x, 'x', _pvt.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>Regards</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 22, 2014 at 2:46 PM, 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"><span class="">On 22 October 2014 14:18, Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com">andrea.giammarchi@gmail.com</a>> wrote:<br>
> FWIW the Multiple WeakMaps approach seems to be 2X ( Chrome ) up to 3X ( FF<br>
> Nightly ) faster than single WeakMap approach but I don't know how much<br>
> WeakMap instances cost in terms of GC operations so this bench might be very<br>
> pointless ( and surely it's premature )<br>
><br>
> Weirdly enough, Chrome Canary seems to be able to optimize the single<br>
> WeakMap approach pretty well, with a gap of 1.25X faster perfs on multiple<br>
> WMs.<br>
<br>
</span>If you really want to micro-benchmark, then perhaps at least use more<br>
reasonable code that avoids unnecessary indirections distorting the<br>
results. That is:<br>
<span class=""><br>
```js<br>
var PrivateCoordinatesMWM = (function () {<br>
</span>  var x_ = new WeakMap<br>
  var y_ = new WeakMap<br>
<br>
  function PrivateCoordinatesMWM(x, y) {<br>
    x_.set(this, x)<br>
    y_.set(this, y)<br>
  }<br>
<br>
  PrivateCoordinatesMWM.prototype.toString = function toString() {<br>
    return ''.concat('[', x_.get(this), y_.get(this), ']')<br>
  };<br>
<br>
  return PrivateCoordinatesMWM<br>
}())<br>
```<br>
<br>
This also happens to be more readable. ;)<br>
<span class="HOEnZb"><font color="#888888"><br>
/Andreas<br>
</font></span></blockquote></div><br></div>