Таймер, установленный по setInterval (и по setTimeout тоже), неточен, а при переключении на иную вкладку некоторые браузеры так и вовсе его затормаживают. Вот демонстрация с учебника местного:
<div id="timer-interval-log"></div>
<p><button onclick="timerIntervalLog()">Запустить повтор с интервалом в 90 мс</button><br /><button onclick="clearInterval(timerIntervalLogTimer)">Остановить повтор</button></p>
<script>
var timerIntervalLogTimer;
function timerIntervalLog() {
var arr = [];
var d = new Date;
timerIntervalLogTimer = setInterval(function() {
var diff = new Date - d;
if (diff > 100) diff = '<span style="color:red">'+diff+'</span>';
arr.push( diff );
if (arr.length > 25) arr.shift();
document.getElementById('timer-interval-log').innerHTML = arr;
d = new Date;
}, 90);
}
</script>
То есть, надо либо проводить калибровку каждую определенную итерацию и при переключении пользователя на страницу (window.onfocus), либо тикать таймер на сервере, и через long-polling подавать сигнал странице, что уже пора чо там делать.