Форум программистов, компьютерный форум, киберфорум
GuardCat
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Оценить эту запись

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

Запись от GuardCat размещена 30.05.2012 в 15:03
Обновил(-а) GuardCat 30.05.2012 в 15:25

Я решил провести исследование ресурсоёмкости 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
Просмотров: 495
Размер:	70.5 Кб
ID:	732   Нажмите на изображение для увеличения
Название: 002.jpg
Просмотров: 573
Размер:	85.6 Кб
ID:	733   Нажмите на изображение для увеличения
Название: 003.jpg
Просмотров: 380
Размер:	83.7 Кб
ID:	734  

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

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

Размещено в Без категории
Показов 3978 Комментарии 5
Всего комментариев 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 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru