PDA

Visualizza la versione completa : [C++] Differenze di runtime


gqterre
10-11-2010, 13:53
Per prima cosa, non sono sicuro di essere nel topic piu' appropriato della domanda... comunque

Ho creato un programma per C++ di cui ne devo misuare il runtime tramite una funzione appositamente creata inserita nel programma stesso. Se lo eseguo piu' volte sullo stesso computer trovo che il runtime e' sempre diverso, seppur di poco, anche se tutte le altre operazioni che deve eseguire tornano sempre lo stesso risultato corretto. Ma su run di una decina di ore mi ritrovo con differenze di runtime anche di 5 minuti. A cosa sono dovute queste fluttazioni di tempo? E' un problema del'algoritmo stesso per misuare il tempo? Errori del computer?

Vi riporto per scrupolo le funzioni che ho inserito per la misura del tempo:




#include <sys/time.h>

static struct timeval _tstart, _tend;
static struct timezone tz;

void tstart(void) {
gettimeofday(&_tstart,&tz);
}

void tend(void) {
gettimeofday(&_tend,&tz);
}

double tval(){
typedef double s;
s t1, t2;
t1 = (s)_tstart.tv_sec + (s)_tstart.tv_usec/(1000*1000);
t2 = (s)_tend.tv_sec + (s)_tend.tv_usec/(1000*1000);
return t2 - t1;
}


in pratica chiamo la funzione tstart quando voglio far partire il tempo, chiamo tend quando lo voglio bloccare e con tval mi riporta il tempo.

MItaly
10-11-2010, 15:23
Il tuo codice non ha l'uso esclusivo della CPU, e anche se non sono in esecuzione altri programmi "esigenti" ci sono comunque tutti i vari demoni in esecuzione, così come il resto del sistema operativo, che rubano ogni tanto qualche punto percentuale di CPU per poter operare, in maniera in linea di massima non deterministica. Inoltre, sempre per motivi connessi al fatto che il tuo programma non è l'unico codice che sta andando in questo momento, da esecuzione ad esecuzione avrai cache miss o page faults in momenti diversi, il che causa discrepanze tra un'esecuzione e l'altra. Se poi inizi ad usare il disco o la rete butti dentro un'enormità di fattori più o meno casuali (latenza di rete, posizione delle testine del disco, posizione angolare del piatto, situazione delle varie cache, ...).

In sintesi: se vuoi un'esecuzione che sia ogni volta perfettamente identica devi usare un sistema operativo realtime (a dirla tutta i sistemi operativi "normali" multitasking preemptive sotto certi aspetti possono essere forzati a darti tutta la CPU finché non la rilasci, ma comunque non è sufficiente), o avere il completo controllo di cosa sta andando sulla CPU (=il tuo software è il solo codice attualmente in esecuzione, accade solitamente con i microcontrollori) e non dipendere in nulla da input esterni che possono introdurre fattori di casualità.

gqterre
10-11-2010, 20:23
Grazie mille!! Chiaro ed esaustivo!! Immaginavo che fosse un problema di gestione del programma da parte del sistema operativo, ma volevo esserne certo e sentire pareri più esperti del mio :-) Grazie mille ancora

MItaly
10-11-2010, 22:21
Di niente, ciao! :ciauz:

Loading