Производительность Javascript при работе на несосредоточенной вкладке - PullRequest
11 голосов
/ 05 июля 2011

Кажется, что произошли изменения в некоторых последних версиях Chrome и Firefox *, и теперь выполнение Javascript кажется другим, когда вкладка, в которой он запущен, не является в данный момент сфокусированной.

Когда я запускаю свои модульные тесты Javascript, они обычно занимают около 20 секунд, но теперь, когда вкладка не сфокусирована, это занимает более 2000 секунд.Что странно, так это то, что время выполнения каждого отдельного теста не изменяется (большинство из них все еще <10 мс).Бегущий по тестам, который я использую, добавляет <code>setTimeout(0) между запусками каждого теста, чтобы браузер не блокировался во время выполнения, и это кажется вероятным виновником.

Есть ли способ сообщить Javascriptдвигатель не "деприоритизировать" эту вкладку, хотя?Приятно иметь возможность запускать свои тесты в фоновом режиме, не наблюдая за собой ...

* извините, мне все равно, достаточно попробовать установить старые версии, чтобы найти, когда это началось,По крайней мере, сейчас это происходит в Firefox 5.0 и Chrome 12.

Ответы [ 4 ]

10 голосов
/ 05 июля 2011

setTimeout и setInterval были уменьшены до минимума 1000 мс в несфокусированных вкладках. Здесь - отчет Bugzilla, в котором он упоминается. А вот аналогичный отчет об ошибках Chromium . Я полагаю, что это относится к Firefox 5 и Chrome начиная с версии 11.

Согласно MDN :

In (Firefox 5.0 / Thunderbird 5.0) и Chrome 11, время ожидания ограничено стрельба не чаще, чем один раз за второе (1000 мс) в неактивных вкладках; увидеть ошибка 633421 для получения дополнительной информации о это в Mozilla или crbug.com/66078 для подробности об этом в Chrome.

Что касается того, чтобы обойти это ограничение, вы можете попробовать технику, описанную в этой статье , но у меня еще не было изменений, чтобы попробовать это сам.

6 голосов
/ 06 июля 2011

В частности, для Firefox вы можете изменить настройку dom.min_background_timeout_value в about:config на номер по своему вкусу в профиле, который вы используете для запуска тестов. Я бы не советовал делать это в вашем профиле просмотра по умолчанию: причина высокого ограничения заключается в том, что он сокращает веб-сайты в фоновых вкладках, жуя обновления процессора, глупые тикеры и тому подобное.

2 голосов
/ 05 июля 2011

Изменением было увеличено (на много) минимальное значение тайм-аута.Насколько мне известно, нет способа контролировать это;это во внутренностях реализации таймера.И Chrome, и Firefox делают это сейчас, возможно, и Safari.

Это становится довольно странно, если вы используете setInterval (), потому что кажется, что браузер хочет убедиться, что интервальный обратный вызов вызывается по правильному номерураз.Когда вы возвращаетесь на страницу, вы получаете всплеск активности от интервальных таймеров, когда они догоняют.

0 голосов
/ 31 декабря 2011

Я мог бы обойти это, используя несколько setInterval ():

var setRealInterval = function(callback, interval) {
    var minBrowserInterval = 1000
    var setIntervalsCount = Math.max(1, minBrowserInterval / interval)
    for (var i = 0; i < setIntervalsCount; i++) {
        ;(function(i) {
            setTimeout(function() {
                setInterval(callback, interval * setIntervalsCount)
            }, i * interval)
        })(i)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...