Javascript setinterval () отставание в Firefox? - PullRequest
1 голос
/ 26 апреля 2011

Я написал этот код для подсчета секунд (с decisec & centisec).

    You've wasted time <span id="alltime">0.00</span> seconds.

    <script type="text/javascript"> 
    function zeroPad(num,count)
    {
    var numZeropad = num + '';
    while(numZeropad.length < count) { numZeropad = "0" + numZeropad; }
    return numZeropad; }
    function counttwo() {
    tall = document.getElementById('alltime').innerHTML;
    if(parseFloat(tall) < 1.00) {     tnew2 = tall.replace('0.0','').replace('0.','');    }
        else {    tnew2 = tall.replace('.','');    }
    tnum = parseInt(tnew2) + 1;
       //check if have to add zero 
if(tnum >= 100) { tstr1 = tnum + ''; }
        else { tstr1 = zeroPad(tnum,3); }
    tlast = tstr1.substr(0,tstr1.length - 2) + '.' + tstr1.substr(tstr1.length - 2);
        document.getElementById("alltime").innerHTML = tlast;
    }
    var inttwo=setInterval("counttwo()",10);
    </script>

В HTML-документе и запуска.

Работает хорошо, но когда я использую Firefox 4и запустить код.Похоже, он немного задерживается (немного останавливается перед подсчетом), когда он находится на некоторых числах (случайным образом, например, 12.20, 4.43).Я попытался изменить "counttwo ()" на counttwo, но это не помогает.

Я велел некоторым из моих друзей запускать и Firefox 4.Они сказали, что это не лагает вообще.Это из-за моего компьютера?или мой Firefox?или что-то еще?

Заранее спасибо!

PS.Скрипка здесь: http://jsfiddle.net/XvkGy/5/ Зеркало: http://bit.ly/hjVtXS

Ответы [ 5 ]

2 голосов
/ 26 апреля 2011

Когда вы используете setInterval или setTimeout, временной интервал не является точным по нескольким причинам. Это зависит от того, работает ли другой javascript, от браузера, процессора и т. Д. Надежность afaik должна быть достоверной +15 мс. Смотрите также ...

1 голос
/ 26 апреля 2011

Если вы просто видите паузы время от времени, вы, вероятно, видите паузы при сборке мусора или цикле.

Вы можете проверить это, переключив ваше предпочтение javascript.options.mem.log на true в about:config, а затем проследив на вкладке «Сообщения» консоли ошибок при запуске сценария. Если сообщения GC / CC коррелируют с вашими паузами, то они являются объяснением того, что вы видите.

Что касается того, почему вы видите это, но другие не видят ... вы видите проблему, если отключаете все свои расширения?

1 голос
/ 26 апреля 2011

Проблема с setInterval заключается в том, что это может в конечном итоге привести к резервному копированию. Это происходит потому, что механизм JavaScript пытается выполнить функцию с интервалом (в вашем случае, 10 мс), но если когда-либо это выполнение займет дольше , чем 10 мс, механизм JS начнет пытаться выполнить следующий интервал до того, как текущий останавливается (что на самом деле означает, что он ставит его в очередь для запуска, как только завершится предыдущий обратный вызов).

Поскольку JavaScript выполняется однопоточным (за исключением веб-работников в HTML 5), это может привести к паузам в ваших обновлениях пользовательского интерфейса или DOM, поскольку он постоянно обрабатывает обратные вызовы JavaScript из вашего setInterval. В худшем случае вся страница может перестать отвечать на запросы, потому что ваш стек незавершенных setInterval выполнений становится длиннее и длиннее, а не завершается полностью.

За некоторыми исключениями, обычно считается более безопасной ставкой использовать setTimeout (и снова вызывать setTimeout после выполнения обратного вызова) вместо setInterval. С setTimeout вы можете гарантировать, что один и только один тайм-аут когда-либо будет поставлен в очередь. А так как таймеры в любом случае являются только приблизительными (то, что вы указываете 10 мс, не означает, что это произойдет ровно при 10 мс), вы обычно ничего не получаете от использования setInterval сверх setTimeout.

Пример использования setTimeout:

var count = function(){
    // do something

    // queue up execution once again
    setTimeout(count, 10);
};

count();

Одна из причин, по которой вы можете увидеть паузы в некоторых браузерах, а не в других, заключается в том, что не все механизмы JavaScript созданы одинаковыми :). Некоторые из них быстрее, чем другие, и, следовательно, с меньшей вероятностью получат резервную копию setInterval.

1 голос
/ 26 апреля 2011

Это большой счет, так что на каком-то компьютере, да, он может отставать (если он доисторический, или пользователь действительно чем-то занят своим процессором), также, если я прав, эта штука не будет работать с Chrome V8, поскольку этот сценарий зависнет, если вы переключите вкладки, и возобновит выполнение только после возврата на эту вкладку.

0 голосов
/ 26 апреля 2011

Различные браузеры используют разные движки JavaScript, поэтому возможно, что этот код просто найдет место, где у скриптового движка Firefox JägerMonkey есть некоторые проблемы.Кажется, не существует очевидной неэффективности самого подсчетаВы сможете сделать, изменив код.

...