let toBeIncremented = 0; function megamorphicGetIncremented(thisIsMegamorphic, thisIsAlwaysTrue) { // We need this to always evaluate as foo, and have an else clause which // would bail if we ever hit it.
let key = thisIsAlwaysTrue ? "foo" : thisIsMegamorphic.bob;
// The first megamorphic load: if (!thisIsMegamorphic[key]) { // The store which invalidates it
thisIsMegamorphic[key] = ++toBeIncremented;
} // The megamorphic load which was bugged return thisIsMegamorphic[key];
}
// We just need enough shapes to go megamorphic. Put in a bunch though // just to be sure
let objShapes = [
{a: 1}, // We need the shapes to occasionally have "foo" defined, but be false, // otherwise stub folding will mean we don't go megamorphic because // we'll just attach "Missing" which in our case just differs by a // single shape guard.
{b: 1, baz: 2, foo: false},
{c: 1},
{d: 1, baz: 2, foo: false},
{e: 1},
{f: 1, baz: 2, foo: false},
{g: 1},
{h: 1, baz: 2, foo: false},
{i: 1},
{j: 1, baz: 2, foo: false},
{k: 1},
{l: 1, baz: 2, foo: false},
{m: 1},
{n: 1, baz: 2, foo: false},
{o: 1},
{p: 1, baz: 2, foo: false},
{q: 1},
{r: 1, baz: 2, foo: false},
{s: 1},
{t: 1, baz: 2, foo: false},
];
let objs = []; for (let i = 0; i < 100; i++) {
let obj = Object.assign({}, objShapes[i % objShapes.length]);
objs.push(obj);
}
for (let i = 1; i < 100; i++) {
let id = megamorphicGetIncremented(objs[i], true);
assertEq(id, i);
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.