Timer to timer.
#1

И снова здравствуйте уважаемые форумчани
Сегодня задался вопросом (опять же с русского форума) по поводу оптимизации таймеров.

Было предложено следующие: "засунуть" некоторое кол-во таймеров под один таймер в 1 секунду.

Сам код (by frog163)
PHP код:
new secondAll 1
SetTimer("Timer"990true); 
public 
Timer(){ 
    if(
secondAll%(60*10) == 0){//каждые 10 минут 
    

    if(
secondAll%(60*5) == 0){ 
        
//каждые 5 минут 
    

    
//каждую секунду 
    
return secondAll++; 

Будет ли это рациональным решением и что если под один таймер "пихнуть" 5, 10 и более действий (в разном временном диапозоне (то есть 2 минуты, 10 минут, 5 минут и т.п.)) ?
Reply
#2

При условии что выполнение этих таймеров по 2 минуты 10, 5 итд будет происходить на прерываниях.
Reply
#3

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
При условии что выполнение этих таймеров по 2 минуты 10, 5 итд будет происходить на прерываниях.
Если я правильно тебя понял, то так и будет. Таймер выполнил действие на 2 минуты и ждет другово например на 5 минут.
То есть этот способ рационален или есть что то получше?
Reply
#4

Quote:
Originally Posted by ZAM
Посмотреть сообщение
Если я правильно тебя понял, то так и будет. Таймер выполнил действие на 2 минуты и ждет другово например на 5 минут.
То есть этот способ рационален или есть что то получше?
Я имею ввиду...
pawn Код:
new nbit;
OneMinTimer()
{
 nbit++;
 if(nbit==5)
 {
  SetTimer("FiveMinTimer",1,0);//<- это прерывание. Означает, что код данной функции не будет выполнятся в теле этой функции.
  nbit=0;
 }
 return 1;
}
Reply
#5

Если делать аккуратно то вполне себе реализация, только кто вам сказал что таймеры нагружают сервер?
И я бы не делал глобальную переменную для счетчика:
pawn Код:
SetTimer("Timer", 990, true);
public Timer() {
    static secondAll = 0;
    if (secondAll > 59) secondAll = 0;
    if (!(secondAll % 10)) {//каждые 10 минут
    }
    if (!(secondAll % 5)) {//каждые 5 минут
    }
    //каждую секунду  
    secondAll++;
}
Reply
#6

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Если делать аккуратно то вполне себе реализация, только кто вам сказал что таймеры нагружают сервер?
Знаю по собственному опыту. Да и если предположить, что "машине" нужно выполнять кучу действия за 1, 2 , 3 секунды.

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
И я бы не делал глобальную переменную для счетчика:
Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Я имею ввиду...
Ок, спасибо за коды, что нибудь придумаю
Reply
#7

У меня в моде есть таймер, который выполняется каждую секунду. Для таймеров, которые выполняются не так часто, я создал по переменной, которая хранит gettime() следующего выполнения. В односекундном таймере делаю проверку, если время таймера пришло, то вызываю его функцию, а переменной присваиваю следующее время выполнения. Думаю таким образом использовать "таймеры" будет намного экономичнее, чем обычно.
Reply
#8

Quote:
Originally Posted by stabker
Посмотреть сообщение
У меня в моде есть таймер, который выполняется каждую секунду. Для таймеров, которые выполняются не так часто, я создал по переменной, которая хранит gettime() следующего выполнения. В односекундном таймере делаю проверку, если время таймера пришло, то вызываю его функцию, а переменной присваиваю следующее время выполнения. Думаю таким образом использовать "таймеры" будет намного экономичнее, чем обычно.
Фактический тоже самое. Только ты подсчитываешь время выполнения функции.
Reply
#9

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Если делать аккуратно то вполне себе реализация, только кто вам сказал что таймеры нагружают сервер?
И я бы не делал глобальную переменную для счетчика:
pawn Код:
SetTimer("Timer", 990, true);
public Timer() {
    static secondAll = 0;
    if (secondAll > 59) secondAll = 0;
    if (!(secondAll % 10)) {//каждые 10 минут
    }
    if (!(secondAll % 5)) {//каждые 5 минут
    }
    //каждую секунду  
    secondAll++;
}
Все зависит от объема тела таймеров. Мне тут буквально неделю назад постучались ребята, просящие оптимизацию, сервер видите ли у них сильно лагал, взглянул, ахнул, решил замерить. Тело секундного(и единственного) таймера выполнялось 2900 тиков А вы говорите не нагружают ))
Reply
#10

Кроме экономии мизерной памяти которая хранит в себе инфу о таймере, я тут ничего не вижу. Нагружают не сами таймеры, а то что они вызывают. Тет же код, в том же виде но в одном едином таймере не снизит нагрузки.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)