Misurare tempi di esecuzione sketch

volevo chiedere qual'è il sistema piu sicuro per misurare quanto impiega il loop a girare
mi serve sopratutto sapere se facendo delle modifiche allo sketch guadagno qualche millisecondo in velocità

Non so se ho ben capito, comunque direi una cosa del tipo (mostra il tempo in millisecondi):

...
unsigned long t0, t1;
void loop()
{
  t0 = millis();
  ... // qui tutto il codice
  t1 = millis();
  Serial.println(t1-t0);
}

Forse l'ordine di grandezza più adeguato sarebbe il microsecondo e quindi sulla base di quanto già indicato da @docdoc

...
unsigned long t0;
void loop()
{
  t0 = micros();
  ... // qui tutto il codice
  Serial.println(micros()-t0);
}

ho sempre avuto il sospetto che la serial print disturba/rallenta (essa stessa) in maniera "pesante" lo sketch,
giusto?

Il tempo di riempire il buffer di trasmissione, pochi microsecondi se i dati sono pochi (come in questo caso).

La Serial print va chiamata ogni tot, non a ogni giro di loop, in modo da lasciare il tempo ai byte precedenti di essere trasmessi.

L'alternativa è quella di ricavare il numero di cicli per ogni secondo. Un contatore nel loop, una if millis ecc dopo 1 secondo stampi il valore del contatore, salvi millis e azzeri il contatore.

Se il contatore ad esempio totalizza 527, (1/527) x 1000 = 1,897ms

Ciao.

L'unico sistema piuttosto preciso è alzare un pin all'inizio del ciclo che si vuole misurare, abbassarlo alla fine e leggere il suddetto pin con un oscilloscopio calcolando esattamente la durata del periodo. Se il pin lo si alza e lo si abbassa comandandolo direttamnete invece che con la digitalWrite() la misura è ancora più precisa :wink:

Guglielmo

1 Like

ecco!!! che il forum serve sempre... :sunglasses: a questo non ci vevo pensato nonostante ho un oscilloscopio da qualche mese :ok:

...oppure fare "Toggle" nel loop. In questo caso, il tempo del loop sarà pari a un semiperiodo del segnale in uscita (solo la metà a livello alto o solo quella a livello basso):
PINx |= 1<<n_bit;

Per esempio, per l'I/O 3 (PD3):
PIND |= 1<<3;

che equivale a:
PIND |= 0b1000;

... quanto hai riportao è sicuramente vero per AVR, ma, se ben ricordo ... non credo che elrospo stia usando un AVR ... :roll_eyes:

Guglielmo

Purtroppo non è concesso saperlo... :frowning:

purtroppo sono sempre alle prese con un nano rp2040 e devo trovarte il modo di fare girare il loop piu velocemente possibile meglio esser qualche millisecondo in "anticipo",
a ritardare il loop siamo buoni tutti

Si, per questo io nella mia soluzione non metto la lettura di millis() nella Serial,.print() ma nell'istruzione precedente, al limite adattata usando micros (ed ovviamente impostando la seriale alla massima velocità possibile):

unsigned long t0, t1;
void loop()
{
  t0 = micros();
  ... // qui tutto il codice
  t1 = micros();
  Serial.println(t1-t0);
}

Chiaramente il loop privo della scrittura seriale sarà leggermente più rapido, ma se lo scopo è testare il tempo impiegato dalle istruzioni del loop() è una valida indicazione, al limite facendo come ha detto maurotec ossia accumulare il tempo di "n" iterazioni e mostrare solo il risultato finale, dividendolo per "n". Più di così "nin 'zo'" :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.