PDA

Visualizza la versione completa : funzione getTime() in c++ sotto Windows?


lastrom
26-11-2009, 17:35
Salve, necessito di una qualche funzione di libreria c++ che mi restituisca il tempo corrente. In pratica devo temporizzare una un algoritmo facendo la classica differenza di tempi tra prima che venga chiamato e dopo che ha effettuate tutte le sue belle operazioncine.

conosco solo clock_t che però mi restituisce il numero di clock e non il tempo.
possibile che non esista una funzione getTime come per java e pascal..
naturalmente la cosa sotto linux è fattibile..ma a me serve sotto windows.
Grazie in anticipo per la risposta.

ant_alt
26-11-2009, 17:37
http://msdn.microsoft.com/en-us/library/ms724950%28VS.85%29.aspx

oregon
26-11-2009, 17:37
Time Functions
http://msdn.microsoft.com/en-us/library/ms725473(VS.85).aspx

lastrom
11-12-2009, 19:02
mi servirebbe una funzione che restituisce i nanosecondi..queste arrivano fino ai millisecondi.

oregon
11-12-2009, 19:09
Ti servirebbe anche un hardware e un sistema operativo che possano gestire i nanosecondi ...

ant_alt
11-12-2009, 19:45
Originariamente inviato da oregon
Ti servirebbe anche un hardware e un sistema operativo che possano gestire i nanosecondi ...

che poi a cosa servirebbe?qualunque misurazione verrebe falsata dal ritardo tra il controller usb (segnale tastiera), southbridge, fsb e cpu..o sbaglio?

oregon
11-12-2009, 19:49
Appunto per questo gli ho detto di cercare un altro hardware, non certo un PC ...

MItaly
12-12-2009, 13:56
Ci sono sempre i contatori ad alta risoluzione.
QueryPerformanceCounter (http://msdn.microsoft.com/en-us/library/ms644904%28VS.85%29.aspx)
QueryPerformanceFrequency (http://msdn.microsoft.com/en-us/library/ms644905%28VS.85%29.aspx)
In fondo alla pagina di QueryPerformanceCounter c'è anche una classe che può essere utilizzata per misurare comodamente la durata di una qualche operazione.

In generale, comunque, come ti è già stato detto queste misure così precise hanno poco senso: solo la chiamata alle funzioni in questione ti sballa il conto (il tempo per entrare in ring 0 e uscirne non è indifferente), senza contare che il tuo algoritmo può essere interrotto a metà per dare la CPU ad un altro processo, nel qual caso potresti ottenere un ritardo nell'ordine delle decine o addirittura centinaia di millisecondi (a seconda di che parte del quanto di tempo assegnato l'applicazione impieghi).

lastrom
12-12-2009, 14:06
si..in effetti era questo il mio timore. il problema mi viene dal fatto che dovrei fare una analisi ammortizzata di un semplice counting sort per vari ordini di grandezza. solo che fino a 200.000 elementi mi risulta come tempo di esecuzione sempre 0 millisecondi e non riesco ad inserire più di 500.000 elementi. Di conseguenza non posso modellare l'andamento dei tempi all'aumentare dell'input.

MItaly
12-12-2009, 14:11
In questi casi di solito o si aumenta il numero di elementi (come mai non puoi farlo?) oppure si ripete l'esecuzione dell'algoritmo numerose volte, ma in questo caso hai il problema che se l'ordinamento è effettuato in-place devi rigenerarti un array disordinato, e questo tempo si andrebbe ad aggiungere a quello dell'esecuzione dell'algoritmo.
Potresti provare a prepararti l'array da ordinare da una parte e usare un altro array come array di lavoro; ad ogni iterazione andrai a copiare l'array da ordinare in quello "di lavoro", e poi eseguirai l'ordinamento. Al tempo complessivo ottenuto andrai a togliere il tempo complessivo di copia, che otterrai cronometrando separatamente l'esecuzione di n copie dell'array originale in quello di lavoro (dove n è il numero di iterazioni di cui parlavo prima). È un metodo piuttosto impreciso, ma credo che sia il meglio che tu possa fare.
Per avere risultati sensati, calibra n in modo che il solo tempo di copia complessivo raggiunga almeno qualche decina di millisecondi.

Loading