powered by simpleCommunicator - 2.0.47     © 2025 Programmizd 02
Форумы / Серверный JavaScript (Node.js, Ringo, Nitro, Sling) [игнор отключен] [закрыт для гостей] / Проблема с setInterval при длительных функциях
2 сообщений из 2, страница 1 из 1
Проблема с setInterval при длительных функциях
    #38350855
darkstarx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема такая.
Имеется функция, которая может выполняться дольше, чем заданный интервал ее вызова. Если функция выполняется медленнее, чем установленный интервал, то складывается ощущение, что очередной вызов функции выполняется с большой задержкой (не сразу после окончания предыдущего выполнения функции и даже не через указанный интервал).

Для проверки набросал код:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
var Test = (function () {
    function Test() {
        this.start_loop();
    }
    Test.prototype.start_loop = function () {
        this.intervalId = setInterval(this.process_game.bind(this), 100);
    };

    Test.prototype.stop_loop = function () {
        clearInterval(this.intervalId);
    };

    Test.prototype.process_game = function () {
        console.log(Date.now(), 'start working');

        var x = 0;
        for (var i = 0; i < 10000000; ++i) {
            for (var j = 0; j < 200; ++j) {
                x += 1;
            }
        }

        console.log(Date.now(), 'work done');
    };
    Test.singleton = new Test();
    return Test;
})();



Результат оказался следующим:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
sergey@Sergey:~/projects/test$ tsc --target ES5 test.ts
sergey@Sergey:~/projects/test$ node test
1375290420841 'start working'
1375290423446 'work done'
1375290426162 'start working'
1375290428775 'work done'
1375290431488 'start working'
1375290434092 'work done'
1375290436799 'start working'
1375290439399 'work done'



разница между очередными строками такая:
2605
2716
2613
2713
...

То есть время выполнения функции 2605, а время между окончанием первого выполнения и началом второго 2716. И это совсем не 100 миллисекунд, как я просил у setInterval.
А по докам JavaScript если функция выполняется дольше указанного интервала, то запускаться она следующий раз должна из очереди моментально и без задержек ( http://javascript.info/tutorial/settimeout-setinterval)

Понятно, что console.log асинхронно выводит строки 'start working' и 'work done', но не на столько ведь...
В чем может быть дело, подскажите, пожалуйста.
...
Рейтинг: 0 / 0
Проблема с setInterval при длительных функциях
    #38352251
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в загрузке единственного треда на 2.6 секунды бесполезной работы, после которой фреймворку нужно прийти в себя. Таймеры в JS не являются точными, они не обязаны вызываться ровно каждые 100мс как в системах реального времени.
Судя по всему пишется какой-то код для игр, в этом случае лучше логику игры завязывать не на "тики" системы, а на функцию от времени. На "тики" завязывались в далекие года первых игр, когда долгожданный апгрейд проца ВНЕЗАПНО ускорял все процессы в играх на 200-300%.
Ну и вообще, можно же и погуглить http://stackoverflow.com/questions/12433296/node-js-setinterval-skipping-calls
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Серверный JavaScript (Node.js, Ringo, Nitro, Sling) [игнор отключен] [закрыт для гостей] / Проблема с setInterval при длительных функциях
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]