Go Down

Topic: Misurazione tempi di esecuzione (Read 152 times) previous topic - next topic

LikeB

Jan 23, 2021, 10:46 am Last Edit: Jan 23, 2021, 10:48 am by LikeB
Ciao a tutti, ho bisogno di rendermi conto dei cicli di clock che mi servono per eseguire del codice, devo essere sicuro di non introdurre dei ritardi indesiderati visto che contemporaneamente sto muovendo dei motori passo passo.

Ho pensato di fare una valutazione al volo di massima, per avere un ordine di grandezza. E' più che probabile che il tempo che vado a sottrarre sia insignificante ai miei fini.

Da qui ho buttato giù al volo questo per farmi una idea:
Code: [Select]
unsigned long tempo;
unsigned long somma = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  tempo = micros();
  for (unsigned long i = 0; i <= 1000000; i++) {
   somma+=1;     
   if (somma == 1) { // se commento questo blocco l'esecuzione è istantanea
    somma=0;
   }
  }
 Serial.println(micros()-tempo);     
 somma=0;
}


Mi trovo delle risposte incongruenti. E' come se il compilatore si accorgesse che può fare una ottimizzazione e la fa. Ma è veramente così? Se commento il blocco if centrale (if ( somma == 1 ecc.) l'esecuzione è praticamente istantanea, se lo lascio ecco che mi ritrovo con dei tempi più in linea con quanto atteso, cioè poco oltre il secondo.
Qual'è la spiegazione? E' il compilatore che riesce ad ottimizzare il ciclo?

Grazie.


gpb01

Scusa ma il tuo vecchio account era plinio ... come mai poi è diventato LikeB? ... ti ricordo il punto 16.12 del REGOLAMENTO .... quindi, fammi sapere, grazie.

Guglielmo
Search is Your friend ... or I am Your enemy !

LikeB

#2
Jan 23, 2021, 11:08 am Last Edit: Jan 23, 2021, 11:56 am by LikeB
Non è ho la più vaga idea. Pensavo a memoria fosse quello, ho provato, mi ha fatto entrare. Cosa significa, che ho più account?

gpb01

Si, dimmi quale vuoi che blocco perché la cosa NON è consentita ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

LikeB

Blocca pure quest'ultimo che ho usato ora (LikeB). Mi dispiace, non è certo stato intenzionale. Grazie.

gpb01

Ok, quindi prosegui pure come plinio e blocco LikeB :)

Se hai problemi contattami in MP ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

In merito alla tua domanda ... SI, il compilatore è piuttosto intelligente e, se si accorge che fai cose inutili, le elimina direttamente per velocizzare l'esecuzione :D

Guglielmo
Search is Your friend ... or I am Your enemy !

plinio

#7
Jan 23, 2021, 03:00 pm Last Edit: Jan 23, 2021, 03:04 pm by plinio
Rimane comunque un fatto sorprendente. Ho scritto in ambiente Visual Studio 2019 (in Vb .Net) le stesse istruzioni. Ho dovuto aumentare il numero di cicli a un miliardo per avere dei tempi misurabili, ma la stessa cosa ho fatto su Arduino.
Code: [Select]

        Dim k As Integer
        Dim watch As New System.Diagnostics.Stopwatch()

        watch.Start()
        For i As Integer = 0 To 1000000000
            k += 1
        Next
        watch.Stop()

        MsgBox("Tempo impiegato: " + watch.Elapsed.TotalMilliseconds.ToString)


La cosa che sorprende che è sulla mia macchina impiega circa 2.000 millisecondi per iterare un miliardo di volte, mentre su Arduino lo fa istantaneamente. Chiaramente è un fattore determinato dal compilatore, però che strano che non ci sia più uniformità su questo aspetti.

docdoc

La cosa che sorprende che è sulla mia macchina impiega circa 2.000 millisecondi per iterare un miliardo di volte, mentre su Arduino lo fa istantaneamente.
Io ho un'idea, ma se ci fai vedere il tuo codice Arduino te lo dico... ;)
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

gpb01

#9
Jan 25, 2021, 11:05 am Last Edit: Jan 25, 2021, 11:05 am by gpb01
... Chiaramente è un fattore determinato dal compilatore, però che strano che non ci sia più uniformità su questo aspetti.
Le compilazioni (... e le ottimizzazioni) per MCU sono ben diverse dalle compilazioni per CPU, inoltre, su Arduino l'unica cosa che gira è quel programmino, su un computer ... ci sono appena un tot di cosine in più in esecuzione ...  :smiley-twist:

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up