Javascript использует явные объекты self / window для улучшения производительности - PullRequest
3 голосов
/ 02 сентября 2010

Я прочитал на MSDN , что для повышения эффективности сценариев вы можете использовать self, чтобы сделать явные ссылки на окна явными.

  1. Вы знаете, правда ли это? Означает ли это, что, например, вызов self.location более эффективен, чем просто вызов location без window ранее?

  2. Поскольку текст MSDN относится к self, а не window, происходит ли это повышение производительности только при использовании self? Согласно здесь window и self и window.self - это одно и то же, поэтому не имеет значения, что мы используем, я прошу только убедиться.

  3. Более того, после того, что указано в MSDN, вызов window.self должен быть как-то более производительным, чем вызов self, поскольку последний является свойством window, поэтому при вызове window.self мы используем явный ref.

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

Это та разновидность микрооптимизации, которая на самом деле является пустой тратой времени, но для этого стоит написать обычную Javascript:

(function(window, undefined) {
  // your code, thousands of lines of sheer beauty
})(this);

Это дает вам локальную ссылку на «окно» и надежную «неопределенную» переменную для загрузки.

Почему это пустая трата времени? Потому что для любого обычного кода вы говорите о не более миллисекунды или двух, которые сокращают время выполнения. Никто никогда не заметит этого. Убедитесь, что фактические алгоритмы , которые вы используете для выполнения всего, что вы кодируете, подходят, и позвольте разработчикам интерпретатора Javascript / JIT сократить эти миллисекунды для вас. Если вы одержимы такими вещами, вы в конечном итоге будете вынуждены в конечном итоге написать код, который будет работать на медленнее , потому что вы сделали странные вещи, которые в конечном итоге не были оптимизированы интерпретатором.

1 голос
/ 02 сентября 2010

Хотя это в значительной степени микрооптимизация, прямые ссылки на свойства всегда быстрее, чем поиск переменных. Когда вы пишете location, выполняется что-то подобное:

  1. Ищите location, объявленное в текущей области, возвращайте и выходите, если найдено.
  2. Поднимитесь по иерархии областей на единицу.
  3. Если область действия не Глобальная, перейдите к 1. Если область действия: Глобальная, проверьте наличие location в глобальной области и верните, если найдено, в противном случае выведите необъявленную переменную ошибку.

Аналогичный случай сделан против использования оператора with для создания области видимости для свойств объекта. То же самое касается self, который также является свойством window. self является ссылкой на window, поэтому window.location должно быть быстрее, чем window.self.location. Кроме того, помните, что реализации могут отличаться, поэтому ваш пробег может варьироваться от браузера к браузеру.

Как указал Pointy, большинству разработчиков не нужно беспокоиться о таких микрооптимизациях, как эта. Разница составляет микросекунды и совершенно незаметна для конечных пользователей.

Подробнее:

...