reason-seoul / rescript-collection

Fast and efficient, persistent immutable collection for JS written in 100% ReScript!
https://rescript-collection.pages.dev
MIT License
56 stars 4 forks source link

Bad access performance in Safari #5

Closed namenu closed 3 years ago

namenu commented 3 years ago

Benchmark ScreenShot

According to Safari Web Inspector, every getArrayUnsafe calls cause minor GC. (also in Firefox 84, not in Chrome 87)

Culprit: inner function with closure

function getArrayUnsafe(vec, idx) {
  if (idx >= tailOffset(vec)) {
    return vec.tail;
  }
  var traverse = function (_node, _level) {
    while(true) {
      var level = _level;
      var node = _node;
      if (level === 0) {
        return node;
      }
      var subIdx = (idx >>> level) & bitMask;
      _level = level - 5 | 0;
      _node = getNode(node, subIdx);
      continue ;
    };
  };
  var ar = traverse(vec.root, vec.shift);
  if (ar.TAG !== /* Node */0) {
    return ar._0;
  }
  throw {
        RE_EXN_ID: "Assert_failure",
        _1: [
          "Re_Vector.res",
          138,
          17
        ],
        Error: new Error()
      };
}

Solution: