Настройка производительности и энергосбережения Internet Explorer 9
Представляю материал моего коллеги MVP, лидера форума Windows 7, где он известен как Morpheus. Читатели моего блога получили возможность раньше всех ознакомиться со статьей, которая будет опубликована на OSZone.net через несколько дней в рамках конкурса по IE9.
Чем больше различных элементов приходится обрабатывать движку браузера, тем интенсивнее потребляются ресурсы системы. Эта нагрузка повышает энергопотребление, что особенно актуально для владельцев ноутбуков. У них при высоком энергопотреблении сокращается время автономной работы от батареи.
Internet Explorer 9 получил от создателей новый движок JavaScript, а Вы – возможность отрегулировать баланс между его производительностью и энергосбережением. После установки браузера в управлении электропитанием Windows появляется новая настройка:
Пуск —> Панель управления —> Электропитание —> Настройка плана электропитания* —> Изменить дополнительные параметры питания —> Internet Explorer —>Частота таймера JavaScript
Здесь Вы можете задать поведение при питании от батареи и от сети. Значения у параметров совсем нехитрые: Максимальная производительность и Максимальное энергосбережение.
* по умолчанию настройка имеет различные значения в зависимости от выбранного плана.
Осталось разобраться, что изменение параметра даёт на практике. Для этого нужно раздобыть ноутбук и протестировать.
Выбираю план питания Сбалансированный и выставляю несколько параметров:
- запрет на сон
- запрет на гибридный спящий режим
- запрет на отключение экрана
- переход в гибернацию при 50% заряда батареи (больше ждать смысла нет). Переход в гибернацию нужен, чтобы обойтись без секундомера. Гораздо удобнее определить время включения по событию 100 и время перехода в гибернацию по событию 300, к тому же этот способ точнее.
Выключаю ноутбук, полностью заряжаю батарею, отключаю зарядное устройство, включаю, тестирую.
Чтобы нагрузить JavaScript буду использовать 8 прогонов теста Peacekeeper, а затем машина будет бездействовать до ухода в гибернацию.
Тест повторяю для обоих параметров.
Как Вы видите, всего один параметр достаточно значительно влияет на производительность и энергосбережение.
Рекомендации можно дать такие:
- Если у Вас стационарный компьютер, лучше ставить Максимальную производительность. Разницу в счетах за электричество, Вы вряд ли заметите.
- Если компьютер портативный, и время работы от батареи имеет значение, оптимальным выбором будет Максимальное энергосбережение. Ведь именно этих нескольких минут может когда-нибудь и не хватить 🙂
Об авторе
Morpheus успешно скрывается от агента Смита в лабиринте форумов конференции OSZone.net. Там он ведет беспощадную борьбу со злобными машинами и неумелыми действиями их операторов 🙂
C мая 2012 г. Morpheus развивает свой блог Полезная площадь.
Вас также может заинтересовать:
Я в Telegram
Подпишитесь на канал и читайте интересные записи чаще! Есть вопросы? Задайте их в чате.
комментариев 9
Большое спасибо! Я преподаватель, у меня нет денег на приобретение легальных программ и по этому у меня к вам просьба, если можно, то разъясняйте пожалуйста, как можно стредствами самой ОС-7 добиться хорошого результата, а может даже лучшего.Я вас благодарю за то, что вы уже сделали, я теперь часто захожу на ваш ОЗОН. До свиданья!
Ваша оценка: 0
Андрей, если честно, то я не уловил связь между отсутствием у вас денег на легальные программы и этой записью. В моем блоге нет записей, посвященных платным программам, но большинство из них о платной операционной системе.
Платить или не платить за нее, это ваше личное дело (хотя могли бы гордо использовать Линукс и не жаловаться на свою нищету тут). Но если вы не сможете воспользоваться каким-то из моих советов по причине кривизны вашей г-сборки, это будет следствием избранного вами пути 🙂
Ваша оценка: 0
У меня нуоут HP 4720s, настройки элекропитания выставлены (HP-Recommended) практически то, что и Сбалансированный, Так что визуально разницы в работе от источника и без особо не заметно.
Вопрос у меня такой: -Вот в IE 9 имеется что-то speeddial. Кол-во рядов можно увеличить, а вот колонок я таково не нашёл. Можно?
И почему это задействовано в реестре?
Ваша оценка: 0
Андрей, вам нужно следить за конкурсными статьями по Internet Explorer 9 на OSZone.
Ваша оценка: 0
Правильно, надо смотреть. А я по-гуглил и с вам поближе познакомился. Ещё раз спасибо. IE 7Pro — классно, только с англ. туговато, буду разбираться.
(bogok)
Ваша оценка: 0
Вам Microsoft деньги хоть платит за доп. раскрутку браузера?-Вы работаете там?
Или Вы делаете просто так.
Ваша оценка: -3
Дмитрий, а в чем вы видите раскрутку браузера? У браузера Microsoft новая интересная (и даже уникальная) возможность. Мой коллега о ней рассказал, я разместил его рассказ в блоге.
Нам что, нельзя рассказывать об IE только потому, что упоминание о нем вызывает у вас тошноту? Если вы знаете интересные и уникальные возможности других браузеров, расскажите о них на таком же техническом и языковом уровне, и я с удовольствием размещу ваш рассказ в своем блоге. Слабо?
P.S. Нет, MSFT мне не платит, и я там не работаю. Я публикую такие статьи специально для таких как вы, которые не видят дальше собственного носа, то бишь браузера 🙂
P.P.S. Вас, кстати, не смущает, что подавляющее большинство записей блога посвящено ОС Microsoft. И, кстати, если вы пользуетесь Windows, вас это не напрягает случайно? 😉
Годится! Согласны? +5
В Thinkpad есть собственный менеджер питания. Подскажите есть ли смысл отказать от него в пользу стандартных средств W7? Или задам вопрос по другому, достаточно ли управления питанием от W7 для обычных пользователей? Мне просто не нравятся дополнительные надстройки к ОС, если ее средства справляются с поставленными задачами.
Ваша оценка: 0
Валерий, стандартные средства справляются, но инженеры IBM, наверное, видят какой-то смысл в собственных схемах, иначе бы они не тратили деньги на их создание.
Ваша оценка: +1
Как настроить ноутбук
Покажу как надо настроить ноутбук. Расскажу о настройке электропитания, пароля, жесткого диска, сна, гибернации, энергосбережении, параметрах usb, pci-express, о настройке охлаждения, процессора, экрана, батареи…
1. Настройка электропитания
Нажимаем снизу справа на значок розетки и батареи ПКМ и выбираем ЭЛЕКТРОПИТАНИЕ. Далее настройка схемы электропитания, далее ИЗМЕНИТЬ ДОП. ПАРАМЕТРЫ ПИТАНИЯ.
Требовать введения пароля при пробуждении.
Нужно, чтобы если у вас стоит пароль на вход в компьютер, то он запрашивался при выходе из спящего или ждущего режима.
Отключать жесткий диск через.
Нужно для того, чтобы ЖД при простое (когда вы или система не делает никакой запрос к ЖД, например) отключался, чтобы снизить энергопотребление. Например когда я не смотрю никакой фильм или не слушаю музыку или лазаю по папкам на своем внешнем ЖД, он через 20 мин. отключается.
Частота таймера javascript
Нужна для частоты исполнения функции в ява скрипте. Чем чаще частота, тем правильнее и плавнее исполняется функция, но также высокая частота может нагружать процессор, а порой даже невероятно сильно нагружать. Например такую проблему можно видеть во флеш роликах кот. переформатированы в .exe файлы. Или когда открыто много документов соц. сети.
Можно оставить как есть, от батареи МАКС. ЭНЕРГОСБЕР, от сети МАКС ПРОИЗВОД.
Показ слайдов
Нужно для того, чтобы если на раб. столе у вас устан. сменять картинку каждые 30 минут например на другую, то при работе от батареи остановив это можно немножко сэкономить заряд. А при работе от сети на счет этого можно не беспокоится.
Параметры адаптера беспроводной сети
Нужно для снижения напряжения на адаптер при простое, т.е. когда вы не используете сеть, то в неё поступает меньше электроэнергии. Для максимальной скорости доступной в вашей сети ставьте МАКС ПРОИЗВОДИТЕЛЬНОСТЬ, если же вы смотрите HD онлайн, то можно поставить и СРЕДНЕЕ ЭНЕРГОСБЕРЕЖЕНИЕ, особенно при работе от батареи, либо МАКС. ЭНЕРГОСБЕРЕЖЕНИЕ.
СОН
В режиме сна комп переход в режим пониженного энергопотребления и при его пробуждении все документы открытые вами остаются открытыми в оперативной памяти. В этом режиме компьютер максимально быстро будет готов к работе, когда он вам понадобится. Но для поддержания этого режима требуется немного электроэнергии.
Гибридный спящий режим
В этом режиме открытые программы и документы сохраняются в памяти и на ЖД, а комп переходит в режим пониженного потребления электроэнергии. Если произойдёт непредвиденный сбой питания, Windows восстановит данные с жёсткого диска. На настольных компьютерах такой режим включен по умолчанию, поэтому, когда вы кликаете на «переход в спящий режим», активируется гибридный спящий режим.
Гибернация после
Режим гибернации сохраняет все открытые программы и файлы вами на ЖД и восстанавливает их при пробуждении компа с ЖД. Пробуждение происходит дольше, чем при режиме СНА, но зато в режиме гибернации компу не требуется электроэнергии и никакой сбой в подаче электроэнергии компу не страшен.
Разрешать таймеры пробуждения
Нужен для того, чтобы возвращать к работе ваш комп, при определенных запланированных событиях. Например проверке на вирусы или сетевая карта дала команду на подключение к инету. В общем чтобы ваш комп самопроизвольно не включался выберите ОТКЛЮЧИТЬ.
Параметры USB
Любое подключенное USB устройство потребляет энергию для работы, чтобы постоянно оно не тратила электропитание ноута включите его временное отключение при простое выбрав РАЗРЕШЕНО.
Действие при закрытии крышки
Когда вы опускаете крышку ноутбука, то можно чтобы ноут переходил в 1 из режимов энергопотребления. Например СОН, ГИБЕРНАЦИЯ (про них я уже рассказал ранее), ЗАВЕРШЕНИЕ РАБОТЫ или можно выбрать чтобы ничего не происходило, помимо отключения монитора.
Действие кнопки питания
Сверху слева или сверху справа на вашем ноуте есть кнопка его включения при выключенном состоянии. Так вот здесь её можно настроить на действие при включенном ноуте. Например Например СОН, ГИБЕРНАЦИЯ (про них я уже рассказал ранее), ЗАВЕРШЕНИЕ РАБОТЫ.
Действие кнопки спящего режима
Кнопка спящего режима бывает отдельно на ноутбуке, либо работает только при сочетании каких-либо клавиш. Либо при зажатой кнопке FN (про кнопку FN и её, функции смотрите в моем из моих предыдущих роликах). Например у меня кнопка кнопка спящего режима на FN + ESCAPE. Ну так вот здесь можно настроить её действие при нажатии кнопки СНА, ноут может уходит в режим СНА или ГИБЕРНАЦИИ.
PCI Express
Позволяет задать энергосбережение для устройств PCI Express за счет производительности.
Откл — нет энергосбережения, PCI устройства на макс. энергопотреблении
Умеренное — всё в меру
МАКС энергосбережение — PCI устройства на макс. энергосбережении
Управление питанием процессора
Минимальное состояние процессора
Позволяет задать нижний предел производительности, т.е. во время того, когда никакие вычисления и просмотр фильма и прослушивание музыки не происходят, то состояние энергопотребления процессора понижается до 5% у меня
Политика охлаждения системы
Пассивный метод — замедляет процессор перед увеличением скорости вентилятора
Активный метод — увеличивает скорость вентилятора перед замедлением процессора
В пассивном методе при достижении процессора определенной температуры система понижает его производительность чтобы его температура снизилась, это также сказывается на производительности, производительность при этом снижается.
В активном режиме при достижении процессора определенной температуры система увеличивает или включает вентилятор (кулер) для охлаждения процессора. Это увеличивает энергопотребление, но не снижает производительность.
Максимальное состояние процессора
Для высокой производительности процессора и макс энергопотребления процессора укажите 100%, для пониженной производительности процессора и макс сбережения энергии укажите например 80% или 60%. При работе от сети ставьте 100%. При работе от батареи поставьте 80%.
Экран
Гашение экрана это снижение его яркости для пониженного энергопотребления. От сети поставьте 5 или 10 минут, от батареи 2 или 5.
Отключать экран
Означает полное его отключение.
Поставьте от батареи 5-10 минут. От сети 10-15 минут.
Яркость экрана
Означает насколько ярко монитор будет работать (тоже что и яркость в телефоне). От батареи поставьте 50%, от сети 100%.
Уровень яркости в режиме пониженной яркости
Позволяет задать используемый по умолчанию уровень яркости экрана при переходе в режим уменьшенной яркости.
Поставьте от батареи 50%, от сети 80%.
Включить адаптивную регулировку яркости
Включает датчик освещенности помещения. Работает так: если в комнате ярко то монитор увеличит яркость, если тускло, то монитор уменьшит яркость. Работает также как на iPhone Автояркость.
Параметры мультимедиа
Здесь мы видим новый режим — Режим отсутствия. Но что же это?
В режиме отсутствия компьютер продолжает выполнение таких задач, как запись запланированных телепрограмм или обмен видеоклипами и музыкальными файлами, но внешне выглядит так, как будет его питание отключено. При этом Монитор отключен. Звук отключен.
Компьютер находится в рабочем состоянии, но энергопотребление снижено. Вентиляторы компьютера работают.
Если через ваш компьютер другие пользователи подключаясь к нему дистанционно слушают музыку или смотрят видео то ставьте от батареи РАЗРЕШИТЬ КОМПУ ПЕРЕХОДИТЬ В РЕЖИМ ОТСУТСТВИЯ. А от сети ЗАПРЕТИТЬ ПЕРЕХОД ИЗ СОСТОЯНИЯ ПРОСТОЯ В СПЯЩИЙ РЕЖИМ.
Если же вы используете комп только для себя, то ставьте от батареи и от сети РАЗРЕШИТЬ КОМПУ ПЕРЕХОДИТЬ В СПЯЩИЙ РЕЖИМ.
При воспроизведении видео
Здесь можно установить снижение качества видео для меньшего энергопотребления. Данный параметр оптимизирует алгоритм воспроизведения видеоматериалов компьютером так, чтобы обеспечить либо максимально возможное качество воспроизведения, либо увеличение времени работы компьютера от батареи.
Если хотите чтобы от батареи работал ноут дольше ставьте ОПТИМИЗАЦИЯ ЭНЕРГОСБЕРЕЖЕНИЯ. А от сети ОПТИМИЗАЦИЯ КАЧЕСТВА ВИДЕО.
Батарея
Действие почти полной разрядки батарей
Здесь мы ставим действие кот. будет происходит при почти полной разрядки батареи ноута.
Итак вновь напомню:
В режиме сна комп переход в режим пониженного энергопотребления и при его пробуждении все документы открытые вами остаются открытыми в оперативной памяти. В этом режиме компьютер максимально быстро будет готов к работе, когда он вам понадобится. Но для поддержания этого режима требуется немного электроэнергии.
Режим гибернации сохраняет все открытые программы и файлы вами на ЖД и восстанавливает их при пробуждении компа с ЖД. Пробуждение происходит дольше, чем при режиме СНА, но зато в режиме гибернации компу не требуется электроэнергии и никакой сбой в подаче электроэнергии компу не страшен.
Гибридный спящий режим
В этом режиме открытые программы и документы сохраняются в памяти и на ЖД, а комп переходит в режим пониженного потребления электроэнергии. Если произойдёт непредвиденный сбой питания, Windows восстановит данные с жёсткого диска. На настольных компьютерах такой режим включен по умолчанию, поэтому, когда вы кликаете на «переход в спящий режим», активируется гибридный спящий режим.
Советую ставить от батареи ГИБЕРНАЦИЯ, а от сети ДЕЙСТВИЕ НЕ ТРЕБУЕТСЯ.
Уровень низкого заряда батареи
Позволяет указать, какой (в процентном выражении) уровень заряда батареи следует считать низким.
Советую задать тут 10%
Уровень почти полной разрядки батареи
Позволяет указать, какой уровень заряда батареи следует считать уровнем почти полной разрядки.
Советую задать тут 5%
Уведомление о низком заряде батареи
Позволяет указать, должно ли появляться всплывающее сообщение о том, что заряд батареи достиг заданного низкого уровня.
Действия низкого заряда батареи
Позволяет задать, что должно произойти, когда заряд батареи опустится до низкого уровня.
Можете выбрать Действие не требуется.
Уровень резервной батареи
Здесь можно задать при каком заряде батареи будет выводится предупредительное сообщение о резервной батарее.
Эксперимент c таймерами JavaScript в Chrome существенно экономит заряд аккума
По результатам анализа «поведения» страниц ряда популярных сайтов в фоновых вкладках Chrome специалисты пришли к выводу, что значительную нагрузку дают так называемые таймеры JavaScript (на https://itvdn.com/ru/specialities/angular-dev подробнее о возможностях JavaScript, технологиях разработки современных веб-приложений и повышении профессионального уровня разработчика).
Как выяснилось, таймеры JavaScript непрерывно отслеживают целый ряд таких параметров страниц (взаимодействие с рекламой, изменения прокрутки и пр), которые пользователю особо и не нужны, но из-за них Chrome потребляет как бы лишнюю энергию.
То есть, расходует больше заряда аккумулятора смартфона, планшета или ноутбука.
В последней версии официальной версии Chrome частота срабатываний таймеров JavaScript ограничена 1 разом в секунду (60 раз в минуту).
И вот, в качестве очередного эксперимента решено было еще больше «подкрутить» ограничитель частоты срабатывания таймеров JavaScript в фоновых вкладках Chrome и посмотреть, как это скажется на уровне его энергопотребления. И, соответственно, на времени автономной работы мобильных девайсов, на которых он установлен.
- Эксперимент 1: 36 популярных сайтов в фоновых вкладках, в активной вкладке — пустая страница (about:blank):
- стандартное ограничение таймеров JavaScript: среднее время разрядки — 6.4 часа;
- сокращенное количество срабатываний таймеров JavaScript: среднее время разрядки — 8.2 часа.
- Эксперимент 2: 36 популярных сайтов в фоновых вкладках, в активной вкладке — страница YouTube:
- стандартное ограничение таймеров JavaScript: среднее время разрядки — 4.7 часа;
- сокращенное количество срабатываний таймеров JavaScript: среднее время разрядки — 5.3 часа.
Как видим, разница весьма и весьма существенная. В этой связи также отметим, что упомянутый экспериментальный «ограничитель» JavaScript в Chrome в настоящее время так и называется — Throttle Javascript timers in background.
Согласно описанию функции, в активном режиме она ограничивает количество срабатываний таймеров DOM до 1 раза в минуту и автоматически включается на странице сайта, которая дольше 5 минут остается в скрытой (фоновой) вкладке Chrome.
как уменьшить частоту срабатываний таймеров JavaScript в фоновых вкладках Chrome
В обычном Chrome эта функция еще не доступна, но в 86-м Canary она уже есть (так что, должна появится и в 86-й версии официальной сборки для Windows, macOS, Linux, Android и Chrome OS).
Правда, доступна она пока только в скрытых настройках, потому по умолчанию отключена. Но процедура её активации стандартная:
- в адресной строке браузера пишем chrome://flags и жмем Enter;
- в строке поиска на странице экспериментальных настроек пишем throttle javascript
- включаем функцию Throttle Javascript timers in background (Enabled в меню рядом);
- перезапускаем браузер.
Ну и в завершение также добавим, что Google пока продолжает тестировать новую функцию и проверять, как она повлияет на функционал сайтов.
Известно также, что в случае успешной реализации данного нововведения, такой же «ограничитель», вероятнее всего, появится и у Microsoft Edge, Brave, Vivaldi и Opera (если разработчики не заблокируют его принудительно).
Таймеры JavaScript: все что нужно знать
Здравствуйте, коллеги. Давным-давно на Хабре уже переводилась статья под авторством Джона Резига как раз на эту тему. Прошло уж 10 лет, а тема по-прежнему требует разъяснений. Поэтому предлагаем интересующимся почитать статью Самера Буны, в которой дается не только теоретический обзор таймеров в JavaScript (в контексте Node.js), но и задачи на них.
Несколько недель назад я опубликовал в Твиттере следующий вопрос с одного собеседования:
***Ответьте на него для себя, а потом читайте дальше ***
Примерно половина ответов на этот твит были неверными. Нет, дело НЕ СВЯЗАНО с V8 (или другими VM). Функции вроде setTimeout и setInterval , гордо именуемые «Таймерами JavaScript», не входят ни в одну спецификацию ECMAScript или в реализацию движка JavaScript. Функции-таймеры реализуются на уровне браузера, поэтому в разных браузерах их реализации отличаются. Также таймеры нативно реализуются в самой среде исполнения Node.js.
В браузерах основные функции-таймеры относятся к интерфейсу Window , также связанному с некоторыми другими функциями и объектами. Этот интерфейс предоставляет ко всем своим элементам глобальный доступ в главной области видимости JavaScript. Вот почему функцию setTimeout можно выполнять непосредственно в консоли браузера.
В Node таймеры входят в состав объекта global , который устроен подобно браузерному интерфейсу Window . Исходный код таймеров в Node показан здесь.
Кому-то может показаться, что это просто плохой вопрос с собеседования – какой вообще прок знать подобное?! Я, как JavaScript-разработчик, думаю так: предполагается, что вы должны это знать, поскольку обратное может свидетельствовать, что вы не вполне понимаете, как V8 (и другие виртуальные машины) взаимодействует с браузерами и Node.
Рассмотрим несколько примеров и решим парочку задач на таймеры, давайте?
Для запуска примеров из этой статьи можно воспользоваться командой node. Большинство рассмотренных здесь примеров фигурируют в моем курсе Getting Started with Node.js на Pluralsight.
Отложенное выполнение функции
Таймеры – это функции высшего порядка, при помощи которых можно откладывать или повторять выполнение других функций (таймер получает такую функцию в качестве первого аргумента).
Вот пример отложенного выполнения:
В этом примере при помощи setTimeout вывод приветственного сообщения откладывается на 4 секунды. Второй аргумент setTimeout — это задержка (в мс). Я умножаю 4 на 1000, чтобы получилось 4 секунды.
Первый аргумент setTimeout – функция, выполнение которой будет откладываться.
Если выполнить файл example1.js командой node, Node приостановится на 4 секунды, а затем выведет приветственное сообщение (после чего последует выход).Обратите внимание: первый аргумент setTimeout — это всего лишь ссылка на функцию. Она не должна быть встроенной функцией – такой, как example1.js . Вот тот же самый пример без использования встроенной функции:
Передача аргументов
Если функция, для задержки которой используется setTimeout , принимает какие-либо аргументы, то можно использовать оставшиеся аргументы самой функции setTimeout (после тех 2, которые мы уже успели изучить) для переброски значений аргументов к отложенной функции.
Вышеприведенная функция rocks , отложенная на 2 секунды, принимает аргумент who , и вызов setTimeout передает ей значение “Node.js” в качестве такого аргумента who .
При выполнении example2.js командой node фраза “Node.js rocks” будет выведена на экран через 2 секунды.
Задача на таймеры #1
Итак, опираясь на уже изученный материал о setTimeout , выведем 2 следующих сообщения после соответствующих задержек.
- Сообщение “Hello after 4 seconds” выводим через 4 секунды.
- Сообщение “Hello after 8 seconds” выводим через 8 секунд.
В вашем решении можно определить всего одну функцию, содержащую встроенные функции. Это означает, что множество вызовов setTimeout должны будут использовать одну и ту же функцию.
Вот как я бы решил эту задачу:
У меня theOneFunc получает аргумент delay и использует значение данного аргумента delay в сообщении, выводимом на экран. Таким образом, функция может выводить разные сообщения в зависимости от того, какое значение задержки мы ей сообщим.
Затем я использовал theOneFunc в двух вызовах setTimeout , причем, первый вызов срабатывает через 4 секунды, а второй – через 8 секунд. Оба эти вызова setTimeout также получают 3-й аргумент, представляющий аргумент delay для theOneFunc .
Выполнив файл solution1.js командой node, мы выведем на экран требования задачи, причем, первое сообщение появится через 4 секунды, а второе — через 8 секунд.
Повторяем выполнение функции
А что, если бы я задал вам выводить сообщение каждые 4 секунды, неограниченно долго?
Конечно, можно заключить setTimeout в цикл, но в API таймеров также предлагается функция setInterval , при помощи которой можно запрограммировать «вечное» выполнение какой-либо операции.Вот пример setInterval :
Этот код будет выводить сообщение каждые 3 секунды. Если выполнить example3.js командой node , то Node будет выводить эту команду до тех пор, пока вы принудительно не завершите процесс (CTRL+C).
Отмена таймеров
Поскольку при вызове функции таймера назначается действие, это действие также можно отменить, прежде, чем он будет выполнен.
Вызов setTimeout возвращает ID таймера, и можно использовать этот ID таймера при вызове clearTimeout , чтобы отменить таймер. Вот пример:
Этот простой таймер должен срабатывать через 0 мс (то есть, сразу же), но этого не произойдет, поскольку мы захватываем значение timerId и немедленно отменяем этот таймер при помощи вызова clearTimeout .
При выполнении example4.js командой node , Node ничего не напечатает — процесс просто сразу же завершится.
Кстати, в Node.js предусмотрен и другой способ задать setTimeout со значением 0 мс. В API таймеров Node.js есть еще одна функция под названием setImmediate , и она в принципе делает то же самое, что и setTimeout со значением 0 мс, но в данном случае задержку можно не указывать:
Функция setImmediate поддерживается не во всех браузерах. Не используйте ее в клиентском коде.
Наряду с clearTimeout есть функция clearInterval , которая делает то же самое, но с вызовами setInerval , а также есть вызов clearImmediate .
Задержка таймера – вещь не гарантированная
Вы заметили, что в предыдущем примере при выполнении операции с setTimeout после 0 мс эта операция происходит не сразу же (после setTimeout ), а только после того, как будет целиком выполнен весь код скрипта (в том числе, вызов clearTimeout )?
Позвольте мне пояснить этот момент на примере. Вот простой вызов setTimeout , который должен бы сработать через полсекунды — но этого не происходит:
Сразу после определения таймера в данном примере мы синхронно блокируем среду времени выполнения большим циклом for . Значение 1e10 равно 1 с 10 нулями, поэтому цикл длится 10 миллиардов процессорных тактов (в принципе, так имитируется перегруженный процессор). Node ничего не может сделать, пока этот цикл не завершится.
Разумеется, на практике так делать очень плохо, но данный пример помогает понять, что задержка setTimeout – это не гарантированное, а, скорее, минимальное значение. Величина 500 мс означает, что задержка продлится минимум 500 мс. На самом деле, скрипту потребуется гораздо больше времени для вывода приветственной строки на экран. Сначала ему придется дождаться, пока завершится блокирующий цикл.
Задача на таймеры #2
Напишите скрипт, который будет выводить сообщение “Hello World” раз в секунду, но всего 5 раз. После 5 итераций скрипт должен вывести сообщение “Done”, после чего процесс Node завершится.
Ограничение: при решении данной задачи нельзя вызывать setTimeout .
Подсказка: нужен счетчик.
Вот как я бы решил эту задачу:
В качестве исходного значения counter я задал 0, а затем вызвал setInterval , берущий его id.
Отложенная функция будет выводить сообщение и всякий раз при этом увеличивать счетчик на единицу. Внутри отложенной функции у нас инструкция if, которая будет проверять, не прошло ли уже 5 итераций. По истечении 5 итераций программа выведет “Done” и очистит значение интервала, воспользовавшись захваченной константой intervalId . Задержка интервала — 1000 мс.
«Кто» именно вызывает отложенные функции?
При использовании ключевого слова JavaScript this внутри обычной функции, вот так например:
значение в ключевом слове this будет соответствовать вызывающей стороне. Если определить вышеупомянутую функцию внутри Node REPL, то вызывать ее будет объект global . Если определить функцию в консоли браузера, то вызывать ее будет объект window .
Давайте определим функцию как свойство объекта, чтобы стало немного понятнее:
Теперь, когда при работе с функцией obj.whoCallMe мы будем напрямую использовать ссылку на нее, в качестве вызывающей стороны будет выступать объект obj (идентифицируемый по своему id ):
А теперь вопрос: кто будет вызывающей стороной, если передать ссылку на obj.whoCallMe вызову setTimetout ?
Кто в данном случае вызывающий?
Ответ будет отличаться в зависимости от того, где выполняется функция таймера. В данном случае просто недопустима зависимость от того, кто — вызывающая сторона. Вы утратите контроль над вызывающей стороной, поскольку именно от реализации таймера будет зависеть, кто в данном случае вызывает вашу функцию. Если протестировать этот код в Node REPL, то вызывающей стороной окажется объект Timeout :
Обратите внимание: это важно лишь в случае, когда ключевое слово JavaScript this используется внутри обычных функций. При использовании стрелочных функций вызывающая сторона вас вообще не должна беспокоить.
Задача на таймеры #3
Напишите скрипт, который будет непрерывно выводить сообщение “Hello World” с варьирующимися задержками. Начните с односекундной задержки, после чего на каждой итерации увеличивайте ее на секунду. На второй итерации задержка будет 2 секунды. На третьей — три, и так далее.
Включите задержку в выводимое сообщение. У вас должен получиться примерно такой вывод:
Hello World. 1
Hello World. 2
Hello World. 3
.Ограничения: переменные можно определять только при помощи const. При помощи let или var — нельзя.
Поскольку длительность задержки в данной задаче – величина переменная, использовать setInterval здесь нельзя, но можно вручную настроить интервальное выполнение при помощи setTimeout внутри рекурсивного вызова. Первая выполненная функция с setTimeout будет создавать следующий таймер, и так далее.
Кроме того, поскольку нельзя использовать let / var , у нас не может быть счетчика для приращения задержки при каждом рекурсивном вызове; вместо этого можно воспользоваться аргументами рекурсивной функции, чтобы выполнять приращение во время рекурсивного вызова.
Вот как можно было бы решить эту задачу:
Задача на таймеры #4
Напишите скрипт, который будет выводить сообщение “Hello World” с такой же структурой задержек, как и в задаче #3, но на этот раз группами по 5 сообщений, а в группах будет основной интервал задержки. Для первой группы из 5 сообщений выбираем исходную задержку в 100 мс, для следующей – 200 мс, для третьей – 300 мс и так далее.
Вот как должен работать этот скрипт:
- На отметке 100 мс скрипт впервые выводит “Hello World”, и делает так 5 раз с интервалом, нарастающим по 100 мс. Первое сообщение появится через 100 мс, второе через 200 мс и т.д.
- После первых 5 сообщений скрипт должен увеличивать основную задержку уже на 200 мс. Таким образом, 6-е сообщение будет выведено через 500 мс + 200 мс (700 мс), 7-е — 900 мс, 8-е сообщение – через 1100 мс, и так далее.
- После 10 сообщений скрипт должен увеличивать основной интервал задержки на 300 мс. 11-е сообщение должно быть выведено через 500 мс + 1000 мс + 300 мс (18000 мс). 12-е сообщение должно быть выведено через 2100 мс, и т.д.
Включите задержку в выводимое сообщение. У вас должен получиться примерно такой вывод (без комментариев):
Hello World. 100 // При 100 мс
Hello World. 100 // При 200 мс
Hello World. 100 // При 300 мс
Hello World. 100 // При 400 мс
Hello World. 100 // При 500 мс
Hello World. 200 // При 700 мс
Hello World. 200 // При 900 мс
Hello World. 200 // При 1100 мс
.Ограничения: Можно использовать лишь вызовы setInterval (а не setTimeout ) и только ОДНУ инструкцию if .
Поскольку мы можем работать только с вызовами setInterval , здесь нам потребуется использовать рекурсию, а также увеличивать задержку следующего вызова setInterval . Кроме того, инструкция if понадобится нам, чтобы это стало происходить лишь после 5 вызовов этой рекурсивной функции.