Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [(MICRO)PILLOLA] Timer

  1. #1
    Utente di HTML.it L'avatar di JHammer
    Registrato dal
    Sep 2004
    Messaggi
    754

    [(MICRO)PILLOLA] Timer

    Voglio presentare una semplice classe per gestire un timer.
    L'idea è nata dalla necessità di misurare il tempo impiegato ad eseguire uno script...al tempo stesso volevo un codice semplice e riutilizzabile per risolvere definitivamente il problema.
    L'interfacccia della classe è davvero molto semplice e ricorda quella di un cronometro:

    codice:
    &sect Caratteristiche
       
          Unità di misura  :      [ms]
          Risoluzione      :    1 [ms]
          Tempo misurabile : &plusmn 24 giorni (int a 32 bit)
    
    
    &sect Interfaccia base
       
          ::Read()
               Ritorna il tempo misurato in ms (valore intero)
    
          ::Reset()
               Resetta il cronometro
    
    
    &sect Interfaccia avanzata
       
          ::Stop()
               Mette in pausa il cronometro
    
          ::Restart()
              Fa ripartire il cronometro
    
          ::Reset($elapsed)
              Resetta in modo che il  tempo trascorso sia pari a $elapsed
              $elapsed può essere negativo
              NOTA: si può anche usare come parametro nel costruttore
    ok...qui la classe

    codice:
    class Timer
    {
    
      // costruttore
      function Timer($elapsed = 0)
      {
        $this->b_stop = false;
        $this->reset($elapsed);
      }
      
      // ritorna millisecondi trascorsi
      function read(){
        return( $this->abstime()-$this->s_time );
      }
      
      // resetta il timer
      function reset($elapsed = 0){
         $this->s_time = $this->p_time = ($this->now()-$elapsed);
      }
        
      // mette in pausa (read() ritornerà sempre lo stesso valore)
      function stop(){
        $this->b_stop = true;
        $this->p_time = $this->now();
      }
      
      // toglie pausa 
      function restart(){
        $this->b_stop = false;
        $this->s_time += ($this->now() - $this->p_time); 
      }
        
      // ritorna tempo assoluto in millisecondi(tenendo conto della pausa)
      function abstime(){
        return($this->b_stop?$this->p_time:$this->now());
      }
      
      // ritorna tempo assoluto in ms  
      function now(){
         list($usec, $sec) = explode(" ",microtime());
         return ( (int)(1000*((float)$usec + (float)$sec))); 
      }
      
      var $s_time;  //tempo iniziale
      var $p_time;  //tempo al momento della pausa
      var $b_stop;  //in pausa? 
    }
    Un esempio semplice semplice di utilizzo (suppongo la classe si trovi nel file timer.php)

    codice:
    <?php
    
       require 'timer.php';
    
       $timer = new Timer();
    
       // ciclo per far passare qualche frazione di secondo
       for($i=0; $i<2000000; $i++){
       }
    
       echo "Tempo trascorso : ".$timer->read()."[ms]
    ";
    
    ?>
    Per i (PHP5) perfezionisti:

    le tre variabili dovrebbero essere private
    il metodo now() statico
    il metodo abstime() privato

    Per il resto che devo dire? Tutto lì...ma non dite che non vi avevo avvertito! Era solo una (micro)pillola!


  2. #2

  3. #3
    Utente di HTML.it L'avatar di JHammer
    Registrato dal
    Sep 2004
    Messaggi
    754
    Grazie!

  4. #4
    Utente bannato
    Registrato dal
    Jan 2002
    Messaggi
    852
    concordo!

  5. #5
    la mia non l'ha cacata nessuno... vabbè che non è sto gran ché

    (vedi firma)

  6. #6
    io cambierei questa:
    codice:
    function read(){
    	return( $this->abstime()-$this->s_time );
    }
    con questa:
    codice:
    function read( $float = 6 ){
    	return number_format( 
    		( $this->abstime() - $this->s_time ), 
    		$float, '.', ''
    	);
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    ottimo lavoro!

    già testata!
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  8. #8
    Utente di HTML.it L'avatar di JHammer
    Registrato dal
    Sep 2004
    Messaggi
    754
    [supersaibal]Originariamente inviato da andr3a
    io cambierei questa:
    codice:
    function read(){
    	return( $this->abstime()-$this->s_time );
    }
    con questa:
    codice:
    function read( $float = 6 ){
    	return number_format( ( $this->abstime() - $this->s_time ), $float, '.', '');
    }
    [/supersaibal]
    Volendo...naturalmente ognuno può adattare alle sue esigenze.
    Purtroppo per evitare perdita di precisione dovuta a cancellazione numerica nel caso di float a 32 bit ho usato degli interi.
    Il vantaggio è che ho una risoluzione di 1ms con precisione lineare anche dopo tre settimane (se servisse... )
    Lo svantaggio è che il numero ritornato è un intero per cui i decimali (frazioni di ms) sono persi...
    Comunque dicevo...se servisse una risoluzione superiore si potrebbero usare i float.

  9. #9
    non l' avevo vista

    return ( (int)(1000*((float)$usec + (float)$sec)));

    ma uno script va testato al massimo dettaglio , non trovo utile avere un timer da 3 giorni ... apache andrebbe in malora dopo 30 secondi, al massimo forzi il timeout ma se hai un pc che lavora 3 giorni butta via tutto ... o cambia lo script


    cmq de gustibus ...


    io uso questa:
    codice:
    class Elapsed {
    	private $start, $detail;
    	final function __construct( $detail = 6 ) {
    	        $this->detail = &$detail;
    	        $this->start = &$this->__microtime();
    	}
    	private function __microtime() {
    		list($us, $s) = explode(' ',microtime());
    		return ((float)$us + (float)$s);
    	}
    	final public function info() {
    		return number_format( 
    		( $this->__microtime() - $this->start ),
    		  $this->detail, '.', ''
    		);
    	}
    }

    esempio:

    $time = &new Elapsed();


    in fondo:


    echo 'created in: '.$time->info().' sec.';




    P.S. il number_format serve che se tu hai 1.2000 evita di scrivere il solo 1.2 sfasando comunque un po' l'output
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #10
    Utente di HTML.it L'avatar di JHammer
    Registrato dal
    Sep 2004
    Messaggi
    754
    per andr3a: Ok...

    PS.: maledetto!!! Mi hai rovinato l'impaginazione!!!
    Stringi il codice...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.