Avatar
Ori
Člen
Avatar
Ori:

Zdravím,
mám tento kód

var d = new Date(datum[2], datum[1], datum[0], cas[0], cas[1], cas[2], 0);


    $('#superTimeHolder').text(d.format('HH:MM:ss'));

    setInterval(function(){

        d.setSeconds(d.getSeconds() + 1);
        console.log(d);
        $('#superTimeHolder').text(d.format('HH:MM:ss'));
        q

    }, 1000);

účelom kódu je updatovať #superTimeHolder každú sekundu a proste jednoducho prirátavať. Problém je, že ak skript beží dlhšiu dobu objavia sa rozdiely ako je možné vidieť tu http://prntscr.com/603b6m (samozrejme, čím dlhšie to beží tým je rozdiel väčší)
Dátum parsujem zo statického textu na stránke(čas generovania stránky)

Stretol sa s tým už niekto? poprípade nejaké iné riešenie čo mi odporúčate?

ešte podotknem že sa jedná o skript pre TamperMonkey(chro­me)

Editováno 2.2.2015 11:35
 
Odpovědět 2.2.2015 11:34
Avatar
Aleš Lulák
Člen
Avatar
Aleš Lulák:

Ahoj,

moc jsem to pravděpodobně nepochopil, proč měříš čas podle sebe?

Pokud by to mělo být měření generování stránky, můžeš jednoduše spočítat rozdíl. Dejme tomu, že chceš dobu načítaní mezi document (pouze stránka) a window (celá stránka včetně skriptů, stylu, obrázků apod.).

var docTime;
var winTime;

document.addEventListener("DOMContentLoaded", function() {
   docTime = parseInt(new Date().getTime());
});

window.addEventListener("load", function() {
   winTime = parseInt(new Date().getTime());
   alert(“Načítaní trvalo: ” + (winTime - docTime));
});

A proč tomu tak je?
“Jádro operačního systému velmi rychle střídá na procesoru běžící procesy” [http://cs.wikipedia.org/…Multitasking]

Jak nám praví Wikipedia, prohlížeč se rychle střídá s jinými aplikacemi a tak vzniká zpoždění, je sice velice málé - v řádech milisekund, či méně - ale je. Sice jsou tam málé nepřesnosti, avšak jak sám píšeš, při delším sledování je rozdíl značně znát.

Ošetření
Aby byl setInterval přesný, budeš si muset vytvořit vlastní intervalovou funkci, která se bude kontrolovat podle času.

Se svým svolením, jelikož naštěstí pro naše ušetření času nejsi jediný, kdo si tohoto problému všiml, jsem si půjčil již vytvořenou funkci:
[https://gist.github.com/manast/1185904]

Použití:

//presny interval//
function interval(duration, fn){
  this.baseline = undefined;

  this.run = function(){
    if(this.baseline === undefined){
      this.baseline = new Date().getTime();
    }
    fn();
    var end = new Date().getTime();
    this.baseline += duration;

    var nextTick = duration - (end - this.baseline);
    if(nextTick<0){
      nextTick = 0;
    }
    (function(i){
        i.timer = setTimeout(function(){
        i.run(end);
      }, nextTick);
    }(this));
  };

this.stop = function(){
   clearTimeout(this.timer);
 };
}
//////////////////

var startTime = Date.now();
var mujInterval = new interval(1000, function(){ //deklarace
     (console.log((Date.now() - startTime) + 'ms')); // tvuj kod
    })

mujInterval.run() //spusteni
mujInterval.stop() //vypnuti
Editováno 2.2.2015 18:41
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 2.2.2015 18:39
Jsem hloupý člověk, proto se musím vzdělávat
Avatar
Ori
Člen
Avatar
Odpovídá na Aleš Lulák
Ori:

Výborne chlape to je ono dík.

 
Nahoru Odpovědět 3.2.2015 10:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.