Почему двойной поиск быстрее, чем один поиск в javascript?

Я вижу некоторое нечетное поведение в тесте jsperf. Вот настройка:

var pro={};
pro._x=3;
var q=Object.create(pro);
q.x=3;
q.z={};
q.z.x=3;

Затем я просто просматриваю каждый из свойств q.x, q._x и q.z.x.

Единственный поиск q.x быстрее, чем поиск прототипа q._x, как и ожидалось. Но двойной поиск q.z.x является самым быстрым. Я ожидал, что q.z.x будет самым медленным, особенно по сравнению с q.x.

q.z.x еще быстрее, чем q.z. Что здесь происходит?

Ответы

Ответ 1

То, что делает более глубокий поиск быстрее, - это тот факт, что движок JavaScript может лучше оптимизировать код для производительности, поскольку он точно знает, какой объект он получает.

В отличие от использования Object.create, когда движок не может выполнить свой обычный цикл оптимизации, используя простой старый пустой объект для инициализации свойства z объекта q, в основном позволяет движку выделять соответствующую память и проиндексируйте его соответствующим образом.

Этот фрагмент кода var q=Object.create(pro); в основном сообщает движку JS: "Эй, вы получаете экземпляр Object, но я не знаю, какой он тип. Мог бы быть массив, Objec, RegExp, Date.", В то время как этот фрагмент кода - q.z={}; говорит - "Эй, вы получаете объект Object здесь! Обязательно отложите в сторону некоторую память в соответствии с этим типом данных".