Форум программистов, компьютерный форум, киберфорум
GuardCat
Войти
Регистрация
Восстановить пароль

Исследование ресурсоёмкости setTimeout

Запись от GuardCat размещена 30.05.2012 в 15:03
Показов 4304 Комментарии 5

Я решил провести исследование ресурсоёмкости setTimeout, чтобы ответить на следующие вопросы:
  1. Ощутимо ли много памяти требует setTimeout?
  2. Имеет ли смысл то, как назначается setTimeout: когда несколько их назначается одновременно или же назначение идёт поэтапно: следующий не ранее того, как отработал предыдущий?
  3. Очищает ли JS память от отработанных таймеров?
  4. Можно ли очистить память, используя clearTimeout по отработавшим таймерам?

Начнём:
1. Загружаем Chrome(19), запускаем консоль и встроенный диспетчер задач. Вкладка потребляет 14 084КБ.
2. Создадим рабочие функции.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function littleTest() {console.log(1)} // Просто функция для навешивания по таймеру.
 
  function test(fn, loop) { // Функция навесит указанную функцию loop раз на setTimeout и вернёт каждый идентификатор таймера.
    var result = [  ];
    for (x = 0; x <= loop; x++) {
      result.push(setTimeout(fn, 4000))   
    }
    return result;
  }
  
  function detach(arr) { // Функция примет массив идентификаторов таймеров и очистит таймеры.
    for(x = 0; x < arr.length; x++) {
      clearTimeout(arr[x])
    }
  }
И объявим их в консоли.
Ого! Браузер подоптимизировал память! Уже 13 288КБ.

3. Запускаем
JavaScript
1
 var ids = test(littleTest, 100000);
Смотрим память, как только браузер навесил все таймауты. 46 384КБ! Ого!

4. И смотрим память после отработки таймеров. 23 224КБ. Хм. Ну вот, отстрелил таймеры сборщик мусора, потребление снизилось в два раза от максимума. Но оно всё же значительно больше стартового. Какие-то обломки остались и не оптимизировались.

5. Попробуем очистить память по методу kalabuni. У нас есть все id всех таймеров. А очистим-ка мы их!
JavaScript
1
detach( ids );
Бесполезно. Наоборот, работа цикла отъела ещё небольшой кусочек памяти. 23 284КБ.

Выводы раз:
  1. Использование большого количества таймеров приводит к увеличению потребления памяти, верно.
  2. Но очистку javascript производит самостоятельно, хотя и не идеально.
  3. clearTimeout по отработавшим таймерам бесполезен.
Посмотрим на последовательное назначение таймеров, т.е. когда таймер назначается только после того, как отработал предыдущий.
6. Загружаем Chrome(19), запускаем консоль и встроенный диспетчер задач. Вкладка потребляет 13 056КБ.

7. Запустим последовательно 100 000 таймеров.
JavaScript
1
2
3
4
5
6
var n = 0;
function setHundredTimers() {
  console.log(1);
  if (n++ < 100000) setTimeout( setHundredTimers, 1 );
}
setHundredTimers();
И поснимаем скриншоты...
На двух тысячах, примерно на половине и в конце.
Выводы:
  1. Есть небольшое потребление памяти, связанное с работой цикла. 13 920КБ потребляет вкладка.
  2. Почти в 10 раз меньше потребляется памяти, чем при одновременном назначении обработчиков.
  3. Нет растущих утечек памяти, можно оставлять комп на длительное время (более длительное, чем в предыдущем случае).

Итого: следует назначать следующий setTimeout не раньше, чем отработает предыдущий — так вы сбережёте и память и ресурсы процессора.
Миниатюры
Нажмите на изображение для увеличения
Название: 001.jpg
Просмотров: 694
Размер:	70.5 Кб
ID:	732   Нажмите на изображение для увеличения
Название: 002.jpg
Просмотров: 652
Размер:	85.6 Кб
ID:	733   Нажмите на изображение для увеличения
Название: 003.jpg
Просмотров: 485
Размер:	83.7 Кб
ID:	734  

Нажмите на изображение для увеличения
Название: 004.jpg
Просмотров: 555
Размер:	85.1 Кб
ID:	735   Нажмите на изображение для увеличения
Название: 005.jpg
Просмотров: 635
Размер:	86.8 Кб
ID:	736   Нажмите на изображение для увеличения
Название: 006.jpg
Просмотров: 554
Размер:	56.3 Кб
ID:	737  

Нажмите на изображение для увеличения
Название: 007.1.jpg
Просмотров: 666
Размер:	66.9 Кб
ID:	738   Нажмите на изображение для увеличения
Название: 007.2.jpg
Просмотров: 726
Размер:	67.5 Кб
ID:	739   Нажмите на изображение для увеличения
Название: 007.3.jpg
Просмотров: 622
Размер:	66.3 Кб
ID:	740  

Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 5
Комментарии
  1. Старый комментарий
    Аватар для Alex_pac
    Да ладно копейки все считать. Щас в среднем у браузеры у всех потребляют от 200 мб RAM
    а то бывает и до 400 доходит.

    При сегодняшнем прогрессе, думаю не стоит учитывать что там JS на странице не успел очистить.
    Запись от Alex_pac размещена 30.05.2012 в 17:10 Alex_pac вне форума
  2. Старый комментарий
    Аватар для GuardCat
    Цитата Сообщение от Alex_pac
    Да ладно копейки все считать...
    Если речь о странице, которую открывают на пару минут --- соглашусь. Хотя даже в этом случае, при установке большого количества таймеров одновременно, комп начинает тормозить.

    А если речь о приложении, которое должно быть открыто длительное время, то экономию считаю целесообразной.
    Запись от GuardCat размещена 30.05.2012 в 22:06 GuardCat вне форума
  3. Старый комментарий
    Аватар для snake32
    В очередной раз убеждаюсь что писать клинтские долгоиграющие программы лучше без использования браузеров. Лучше юзать С++/Object Pascal. JS не канает
    Спасибо!
    Запись от snake32 размещена 31.05.2012 в 11:47 snake32 на форуме
  4. Старый комментарий
    Аватар для Alex_pac
    клинтские долгоиграющие программы
    поскольку автор сам сделал вывод, что при последовательном назначении таймер не будет потреблять память, так как таймер будет каждый раз самоуничтожаться после того как отработал.

    Поэтому:

    JS можно использовать для "долгоиграющих программ"
    Запись от Alex_pac размещена 31.05.2012 в 12:13 Alex_pac вне форума
  5. Старый комментарий
    Про копейки вы не правы. Не у всех сильные машины сейчас,я пересел обратно с хрома на оперу именно из-за потребления памяти. Большое спасибо тем, кто не ложит хер и заботится о потребляемых ресурсах
    Запись от ai-zer размещена 31.05.2012 в 21:12 ai-zer вне форума
 
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru