Странное поведение Chrome в цикле for-in

#javascript #performance #google-chrome #scope #comparison

#javascript #Производительность #google-chrome #область #сравнение

Вопрос:

Я столкнулся со странным поведением Chrome при запуске цикла for-in внутри функции переноса.

Скажем, у нас есть объект:

 obj = { 'a': 1, 'b': 2, 'c': 3, 'd': 4 };
  

Исключение этого кода:

 var sum = 0;
for (var val in obj) {
  sum  = obj[val];
}
  

в два раза медленнее, чем вызов этой функции:

 function sumObj(obj) {
  var sum = 0;
  for (var val in obj) {
    sum  = obj[val];
  }
}
  

Нравится:

 sumObj(obj);
  

Браузеры Edge и Firefox обрабатывают этот код одинаково.

Почему Chrome обрабатывает вызов функции быстрее, чем внутренний код напрямую?

Там вы можете найти тест производительности.

Комментарии:

1. Интересный вопрос. Я думаю, это должно быть связано с реализацией v8 движка. На самом деле, с моей точки зрения, не должно быть никакой разницы в производительности.

2.Не забудьте включить hasOwnProperty проверку при использовании for in developer.mozilla.org/en/docs/Web/JavaScript/Reference/…это делается для того, чтобы отфильтровать любое унаследованное.

3. Специфичный для движка ofc, но, возможно, потому, что функция является оптимизируемой единицей, тогда как другой код просто плавает в супе глобальной области.

4. @AlexK. кажется вероятным, я полагаю, что Chrome может оптимизировать функцию, потому что ожидается, что она будет вызываться чаще, но, скорее всего, только часть глобального кода будет выполняться один раз. Кроме того, вам не обязательно выполнять такой код в глобальной области видимости. Тем не менее, это интересное наблюдение.