2014-12-01 3 views
16

Я вижу некоторое нечетное поведение в тесте jsperf. Вот установка:Почему двойной поиск быстрее, чем один поиск в javascript?

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

Тогда я просто LookUp каждое из свойств q.x, q._x и q.z.x.

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

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

+0

Я нахожусь на хроме 38. – gloo

+19

Оптимизация компилятора ... – RobG

+0

Я знаю, что все они одинакового порядка, поэтому это не имеет большого значения, но для меня это не имеет смысла. – gloo

ответ

1

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

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

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