Skip to content

Commit

Permalink
improve iterDeps in some scenarios by 20-30% in v8, no noticeable dow…
Browse files Browse the repository at this point in the history
…nsides in other evergreen browsers

1. don’t enumerate keys, if no deps exist to produce keys
2. in v8 for (x in y) where y is non enumerable deopts entire function [readmore](https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#5-for-in)
3. minor: avoid deep property lookups like x[y][z] if we already have a reference to x[y]
  • Loading branch information
stefanpenner committed Jul 29, 2014
1 parent 18b3a51 commit a210d97
Showing 1 changed file with 23 additions and 15 deletions.
38 changes: 23 additions & 15 deletions packages/ember-metal/lib/property_events.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,28 +100,36 @@ function dependentKeysDidChange(obj, depKey, meta) {
if (top) { DID_SEEN = null; }
}

function keysOf(obj) {
var keys = [];
for (var key in obj) {
keys.push(key);
}
return keys;
}

function iterDeps(method, obj, depKey, seen, meta) {
var guid, deps, keys, key, i, desc;
guid = guidFor(obj);
if (!seen[guid]) seen[guid] = {};
if (seen[guid][depKey]) return;
seen[guid][depKey] = true;
var deps, keys, key, i, desc, descs;
var guid = guidFor(obj);

var current = seen[guid];
if (!current) current = seen[guid] = {};
if (current[depKey]) return;
current[depKey] = true;

deps = meta.deps;
deps = deps && deps[depKey];
keys = [];
if (deps) {
for(key in deps) {
keys.push(key);
keys = keysOf(deps);
descs = meta.descs;

for (i=0; i<keys.length; i++) {
key = keys[i];
desc = descs[key];
if (desc && desc._suspended === obj) continue;
method(obj, key);
}
}

for (i=0; i<keys.length; i++) {
key = keys[i];
desc = meta.descs[key];
if (desc && desc._suspended === obj) continue;
method(obj, key);
}
}

function chainsWillChange(obj, keyName, m) {
Expand Down

0 comments on commit a210d97

Please sign in to comment.