Comments 6
MyTimer = function () {
    setInterval(function () {
            MyFunc(); // прикладной код
        }, 100);
}

Тут точно так?
Может имелось ввиду так?
MyTimer = function () {};
setInterval(MyFunc, 100);


Или не понятно. У вас после каждого интервала объявляется ещё один интервал.
Функциональной ошибки нет. Функция MyTimer должна вызываться один раз для старта setInterval (в исходном коде это хорошо видно — функция APELSERG.MAIN.Timer).

Согласен, что правильнее было бы её назвать, например, StartMyTimer.
Не могу понять, почему прыгает (иногда сильно) белая линия, если она должна быть прямой и показывать уровень (в 40 мс по умолчанию)?
Подозреваю, что в том, что 40мс там далеко не всегда 40.

var start_time = new Date().getTime();
var time = new Date().getTime();
var interval = setInterval(function() {
var new_time = new Date().getTime();
var delta = new_time — time;
time = new_time;
console.log(delta);
if (time — start_time > 5000) {
clearInterval(interval);
}
}, 1000);
А почему псевдонагрузка не вынесена в отдельный таймер, который бы конкурировал с основным таймером? В текущей реализации цикл выполняется синхронно и блокирует остальной код до своего завершения. Это (в теории) уменьшило бы фактическое время от одного вызова до другого.

Проверил, всё так и есть. Разница между планируемой задержкой и фактом примерно равна времени блокировки.

Делаем вот так:
setTimeout(function() {
    // Виртуальная нагрузка

    var startVirtCalcDate = new Date();
    var startVirtCalcTime = startVirtCalcDate.getTime();

    APELSERG.MAIN.VirtCalc();

    var stopVirtCalcDate = new Date();
    var stopVirtCalcTime = stopVirtCalcDate.getTime();

    APELSERG.TOOLBOX.prevVirtCalcMsec = APELSERG.TOOLBOX.currVirtCalcMsec;
    APELSERG.TOOLBOX.currVirtCalcMsec = stopVirtCalcTime - startVirtCalcTime;
})

И красное сливается с белым.
Конкуренция таймеров — это ещё одна интересная тема. В приложении могут конкурировать, например, setInterval и requestAnimationFrame. А ещё, как минимум, прерывания мыши, клавиатуры, изменения в DOM. Поэтому, такое комплексное поведение, лучше рассматривать отдельно.

В данной реализации псевдонагрузка введена:
  • Для примерной оценки стабильности работы заданного таймера под нагрузкой.
  • Для сравнения браузеров (одним достаточно 10 миллионов циклов, другие переваривают миллиард).

Для наглядного ответа на ваш комментарий я создал ещё один проект (самому стало интересно) и ввёл конкурентный таймер setInterval (функция APELSERG.MAIN.StartTimer2), который работает для любого выбранного режима. В конкурентный таймер я поместил псевдонагрузку, а из основного таймера — её убрал.

Общие нагрузочные характеристики не улучшились (хорошо видно, если дать нагрузку побольше). А красное сливается с белым — это правильно, так как период ожидания основного таймера стал приближаться к периоду его полного цикла.

Код с конкурентным таймером на GitHub.
Демо с конкурентным таймером на GitHub.
Only those users with full accounts are able to leave comments. Log in, please.