Почему кэширование значений в объектах занимает больше времени?

#javascript #jquery

#javascript #jquery

Вопрос:

Как я узнал, лучше кэшировать значения в объектах, которые нам нужны повторно. Например, выполнение

 var currentObj = myobject.myinnerobj.innermostobj[i]
  

и использование ‘currentObj’ для дальнейших операций лучше для производительности, чем просто

 myobject.myinnerobj.innermostobj[i]
  

везде, например, в циклах.. Мне сказали, что это каждый раз избавляет скрипт от поиска внутри объектов..

У меня есть около 1000 строк кода, единственное изменение, которое я внес в него с целью повышения производительности, — это это (во многих местах), и общее время, затрачиваемое на его выполнение, увеличилось со 190 мс до 230 мс. Оба раза были проверены с помощью firebug 1.7 в Firefox 4.

Верно ли то, что я узнал (то есть либо я злоупотребляю этим, либо неправильно реализовал)? Или есть какие-то другие аспекты, о которых я не знаю ..?

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

1. Возможно, вы сделали что-то не так, но мы не можем сказать, не увидев код 😉

2. 🙂 Я понимаю, но опубликовать код для меня будет невозможно .. : ( Поэтому я выбрал изменение, которое я сделал, исходя из разницы в двух версиях, и опубликовал..

3. переход justpaste.it вставьте обе версии кода, чтобы мы могли видеть, пожалуйста (я согласен, 2000 строк кода здесь было бы трудно достичь)

4. Мммм. Это определенно должно быть быстрее. Убедитесь, что переменная находится в локальной области видимости и …. ну, я не знаю, что еще можно сказать…

5. Возможно ли, что вы кэшируете значения, которые на самом деле не используются некоторыми путями кода? Не могли бы вы кэшировать вещи, которые используются только один раз?

Ответ №1:

Создание переменной требует начальных затрат, поэтому вам придется использовать переменную несколько раз (в зависимости от сложности поиска и многих других факторов), прежде чем вы увидите какой-либо прирост производительности.

Кроме того, способ выполнения Javascript сильно изменился всего за несколько лет. В настоящее время большинство браузеров компилируют код в той или иной форме, которая изменяет, что является производительным, а что нет. Вероятно, что выигрыш в производительности от кэширования ссылки сейчас меньше, чем при написании рекомендации.

Ответ №2:

Приведенный вами пример, похоже, просто является Javascript, а не jQuery. Поскольку вы используете прямые ссылки на свойства объекта и индексы массива для существующих объектов Javascript, поиск не требуется. Итак, в вашем случае добавление var currentObj... может потенциально увеличить накладные расходы на небольшую сумму, необходимую для создания экземпляра currentObj . Хотя это, вероятно, очень незначительно и нередко для удобства и читаемости кода, в длинном цикле вы, возможно, могли бы заметить разницу при выборе времени.

Кэширование, о котором вы, вероятно, думаете, связано с объектами jQuery, например

 var currentObj = $('some_selector');
  

Запуск селектора jQuery требует значительного объема обработки, поскольку для разрешения селектора необходимо просмотреть весь DOM (или некоторое его подмножество). Таким образом, выполнение этого, по сравнению с запуском селектора каждый раз, когда вы ссылаетесь на что-либо, действительно может сэкономить много накладных расходов. Но это не то, что вы делаете в своем примере.

Посмотрите на эту скрипку:

http://jsfiddle.net/SGqGu/7/

В Firefox и chrome (не тестировал IE) — время одинаково практически в любом сценарии.

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

1. Да, здесь задействован поиск. Для доступа к каждому объекту-члену требуется поиск в наборе элементов объекта, но это, конечно, далеко не так дорого, как поиск элемента в DOM.

2. Поиск свойств объекта определенно требует времени.

3. Если бы javascript интерпретировался на 100%, это было бы правдой, но, как говорится в другом ответе, в наши дни javascript каким-то образом компилируется перед выполнением. Ссылки на свойства объекта являются ссылками и, вероятно, в любом случае будут преобразованы во внутренний указатель.

4. Смотрите Редактирование … как оказалось, на самом деле намного быстрее не создавать «кэшированную» версию ссылки на необработанный объект.

5. Упс, в моей скрипке были ошибки .. теперь исправлено. На самом деле это почти идентично использованию любого метода. Итак, к сожалению, я не раскрыл какой-то большой секрет, но я подтвердил, что кэширование ссылок на объекты на самом деле ничего для вас не делает.

Ответ №3:

Верно ли то, что я узнал (то есть либо я злоупотребляю этим, либо неправильно реализовал)? Или есть какие-то другие аспекты, о которых я не знаю ..?

Не очевидно, так ли это, потому что вы не разместили ссылку на свой код.

Я думаю, что большая часть вашей путаницы происходит от того факта, что разработчики JavaScript в основном озабочены кэшированием объектов DOM. Поиск объектов DOM значительно дороже, чем поиск чего-то подобного myobj.something.something2 . Рискну предположить, что большая часть того, что вы читали о важности кэширования, — это примеры, подобные этому (поскольку вы упомянули jQuery):

 var myButton = $('#my_button');
  

В таких случаях кэширование ссылок на DOM может принести дивиденды в скорости на страницах со сложным DOM. В вашем примере это, вероятно, просто снизило бы читаемость кода, заставив вас помнить, что currentObj это просто псевдоним другого объекта. В цикле это имело бы смысл, но в другом месте не стоило бы запоминать другую переменную.