setInterval vs for Что лучше?:)
Создаю сервер для онлайн игры.
Встал вопрос, как лучше оптимизировать работу. Например на сервере есть 1000 игроков. Каждые 0.2 сек нужно каждому отправить данные. Что лучше? - Создать 1000-чу setInterval(..., 200) для каждого игрока и выполнять в каждом необходимые функции. - Создать 1 for(obj in array) обходящий 1000 элементов в 1 setInterval(..., 200). Буду очень рад услышать Ваши мысли по этому поводу. |
Dorian_bs,
Создать функцию Которая будет вызывать сама себя. Со setTime тра та та. Присвоить каждому игроку id целочисленному. И всё. |
Но с for тоже можно. Если не страшно забить всю ОЗУ
|
koeshiro, то есть Вы считаете данный вариант наиболее оптимизированным? Без использования for и setInterval?
|
Dorian_bs,
да. Ибо насколько знаю после выполнения функции и её перезапуска данные о ней перезаписываются. А вот с for по другому. Всё время все данные остаются. Если пишите на php не забывайте что стандартное время выполнение скрипта до 30 сек. |
koeshiro, Вы это имеете ввиду?
updata = function (user) { // выполняем необходимые функции setTimeout(function () { updata(user); }, 200); } updata('123456789'); // инициализируем пользователя PS: нет, я пишу на NodeJS |
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);} Вызывать функцию надо после выполнения кода =) |
koeshiro, не сильно понял Вашего кода)
Во первых. У нас не используется интервал, а вы пытаетесь его очистить. Во вторых переменная "i" всегда равна 0. |
koeshiro, и еще, на сколько я знаю - setTimeout сам очищается после выполнения.
|
Dorian_bs, i=0? Ясен пень. Ибо в вашем коде должно быть i++ =) А clearInterval написал потому что привычка уже. С надеждой что вы поймёте меня, поймёте мой пример. Хотя надо было писать словами. =)
|
А тут прикол в другом. Если не очистить set Interval функция будет себя вызывать вечно. По этому set Time Out написал я зря. И понимаю что нужно спать :write:
|
koeshiro, я понял)) Но Ваш пример отличается от моего только тем, что у меня пример выполняется бесконечно, а Вы останавливаете выполнение функции заданным числом "num" - количеством раз.
Меня ведь интересует именно сам цикл, а не его остановка) А как же на счет setInterval? Почему бы не использовать эту функцию. Ведь ее природа основывается на предложенном Вами алгоритме |
Dorian_bs, ну таки я говорил. что к чему) В любом случае придёться делать что-то что не даст заполнить весь ОЗУ =)
|
Я протестировал. Создал пустую страницу в Google Chrome.
В диспетчере задач хром показывает, что пустая страница есть 8000кб. памяти. Если использовать цикл for in (i < 1000) в setInterval 200mls, потребление памяти возрастает до 13 324кб. Озу 90-94. Если создать 1000 setInterval с 200mls - потребление памяти возрастает до 53 181кб. Озу 90-95. В первом случае вкладку не удается просто перезагрузить. Все время ожидание. Во втором - страница не так сильно глючит и с ней можно работать. Даже не знаю, что все же лучше. Ибо ОЗУ жрет и там и там |
koeshiro, спасибо за помощь)
Товарищи, есть еще какие либо соображения по этому поводу? |
Dorian_bs,
Можно подчищать память в ходе выполнения. |
Что Вы имеете ввиду?
|
Цитата:
обзор |
nerv_, спасибо, но вопрос не в этом. На данный момент я использую websocket nodejs. Суть вопроса не в реализации передачи данных, а в методе циклической отправки сформированного пакета
|
Вообщем я остановился на варианте создания setInterval для каждого игрока. Да, это будет есть память, но избавит от возможный коллизий в случае, если for не успеет обработать каждого игрока за интервал установленный в setInterval.
Всем огромное спасибо!) |
Цитата:
|
В моем случае выполнить предначертанные функции setInterval'у не должно составить проблем. Надеемся на лучшее)
|
Цитата:
|
nerv_, Задача не стоит в том, что бы всем разослать одно и то же сообщение.
Рассылку необходимо сделать только тем людям, на локации которых произошли изменения. И при этом пакет для каждого пользователя индивидуален. Спасибо за ответы! |
Dorian_bs, спасибо за разъяснения
|
Часовой пояс GMT +3, время: 17:33. |