Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   setInterval vs for Что лучше?:) (https://javascript.ru/forum/misc/42481-setinterval-vs-chto-luchshe.html)

Dorian_bs 28.10.2013 18:57

setInterval vs for Что лучше?:)
 
Создаю сервер для онлайн игры.
Встал вопрос, как лучше оптимизировать работу.

Например на сервере есть 1000 игроков. Каждые 0.2 сек нужно каждому отправить данные.

Что лучше?
- Создать 1000-чу setInterval(..., 200) для каждого игрока и выполнять в каждом необходимые функции.
- Создать 1 for(obj in array) обходящий 1000 элементов в 1 setInterval(..., 200).

Буду очень рад услышать Ваши мысли по этому поводу.

koeshiro 28.10.2013 19:04

Dorian_bs,
Создать функцию Которая будет вызывать сама себя. Со setTime тра та та.
Присвоить каждому игроку id целочисленному. И всё.

koeshiro 28.10.2013 19:05

Но с for тоже можно. Если не страшно забить всю ОЗУ

Dorian_bs 28.10.2013 19:07

koeshiro, то есть Вы считаете данный вариант наиболее оптимизированным? Без использования for и setInterval?

koeshiro 28.10.2013 19:09

Dorian_bs,
да. Ибо насколько знаю после выполнения функции и её перезапуска данные о ней перезаписываются. А вот с for по другому. Всё время все данные остаются. Если пишите на php не забывайте что стандартное время выполнение скрипта до 30 сек.

Dorian_bs 28.10.2013 19:10

koeshiro, Вы это имеете ввиду?
updata = function (user) {
     // выполняем необходимые функции
     setTimeout(function  () {
         updata(user);
     }, 200);
}

updata('123456789'); // инициализируем пользователя


PS: нет, я пишу на NodeJS

koeshiro 28.10.2013 19:18

Dorian_bs,
Не совсем. Пример:
function globalfun(num){
var i=0;
function tra-ta-ta(){
//Ваш код 
var s=setTimeOut(function  () {tra-ta-ta()},200);
if(i=>num){cleatInterval(s);}

Вызывать функцию надо после выполнения кода =)

Dorian_bs 28.10.2013 19:22

koeshiro, не сильно понял Вашего кода)
Во первых. У нас не используется интервал, а вы пытаетесь его очистить.
Во вторых переменная "i" всегда равна 0.

Dorian_bs 28.10.2013 19:25

koeshiro, и еще, на сколько я знаю - setTimeout сам очищается после выполнения.

koeshiro 28.10.2013 19:26

Dorian_bs, i=0? Ясен пень. Ибо в вашем коде должно быть i++ =) А clearInterval написал потому что привычка уже. С надеждой что вы поймёте меня, поймёте мой пример. Хотя надо было писать словами. =)

koeshiro 28.10.2013 19:28

А тут прикол в другом. Если не очистить set Interval функция будет себя вызывать вечно. По этому set Time Out написал я зря. И понимаю что нужно спать :write:

Dorian_bs 28.10.2013 19:33

koeshiro, я понял)) Но Ваш пример отличается от моего только тем, что у меня пример выполняется бесконечно, а Вы останавливаете выполнение функции заданным числом "num" - количеством раз.
Меня ведь интересует именно сам цикл, а не его остановка)

А как же на счет setInterval? Почему бы не использовать эту функцию. Ведь ее природа основывается на предложенном Вами алгоритме

koeshiro 28.10.2013 19:41

Dorian_bs, ну таки я говорил. что к чему) В любом случае придёться делать что-то что не даст заполнить весь ОЗУ =)

Dorian_bs 28.10.2013 19:49

Я протестировал. Создал пустую страницу в Google Chrome.
В диспетчере задач хром показывает, что пустая страница есть 8000кб. памяти.

Если использовать цикл for in (i < 1000) в setInterval 200mls, потребление памяти возрастает до 13 324кб. Озу 90-94.
Если создать 1000 setInterval с 200mls - потребление памяти возрастает до 53 181кб. Озу 90-95.

В первом случае вкладку не удается просто перезагрузить. Все время ожидание.
Во втором - страница не так сильно глючит и с ней можно работать.

Даже не знаю, что все же лучше. Ибо ОЗУ жрет и там и там

Dorian_bs 28.10.2013 19:55

koeshiro, спасибо за помощь)

Товарищи, есть еще какие либо соображения по этому поводу?

koeshiro 28.10.2013 20:07

Dorian_bs,
Можно подчищать память в ходе выполнения.

Dorian_bs 28.10.2013 21:39

Что Вы имеете ввиду?

nerv_ 28.10.2013 22:13

Цитата:

Сообщение от Dorian_bs
Например на сервере есть 1000 игроков. Каждые 0.2 сек нужно каждому отправить данные.

Что лучше?

события с сервера или WebSocket

обзор

Dorian_bs 28.10.2013 22:26

nerv_, спасибо, но вопрос не в этом. На данный момент я использую websocket nodejs. Суть вопроса не в реализации передачи данных, а в методе циклической отправки сформированного пакета

Dorian_bs 28.10.2013 22:33

Вообщем я остановился на варианте создания setInterval для каждого игрока. Да, это будет есть память, но избавит от возможный коллизий в случае, если for не успеет обработать каждого игрока за интервал установленный в setInterval.

Всем огромное спасибо!)

BETEPAH 28.10.2013 23:42

Цитата:

Сообщение от Dorian_bs
избавит от возможный коллизий в случае, если for не успеет обработать каждого игрока за интервал установленный в setInterval

А если setInterval не успеет обработать функции, он может потерять некоторые вызовы. Поэтому однозначного ответа на вопрос нет. Что важнее, избежать коллизии или гарантировать вызовы - that is the question.

Dorian_bs 29.10.2013 00:37

В моем случае выполнить предначертанные функции setInterval'у не должно составить проблем. Надеемся на лучшее)

nerv_ 29.10.2013 12:05

Цитата:

Сообщение от Dorian_bs
nerv_, спасибо, но вопрос не в этом. На данный момент я использую websocket nodejs. Суть вопроса не в реализации передачи данных, а в методе циклической отправки сформированного пакета

ну так не проще с сервера сообщения слать "сразу" всем, чем интервалить на клиенте для каждого? Я на данный момент не знаю, как нода работает с сокетами и есть ли там менеджер соединений, чтобы отдать команду на отправку сообщения сразу всем клиентам.

Dorian_bs 29.10.2013 16:19

nerv_, Задача не стоит в том, что бы всем разослать одно и то же сообщение.
Рассылку необходимо сделать только тем людям, на локации которых произошли изменения. И при этом пакет для каждого пользователя индивидуален.

Спасибо за ответы!

nerv_ 29.10.2013 17:54

Dorian_bs, спасибо за разъяснения


Часовой пояс GMT +3, время: 17:33.