Chirurgia endoscopică a hipofizei
"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală. Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale. www.neurohope.ro |
Masurarea duratei unei operatii
Last Updated: Dec 07 2013 09:59, Started by
dani.user
, Dec 06 2013 20:53
·
0
#1
Posted 06 December 2013 - 20:53
Deseori intalnim nevoia de a vedea cat anume dureaza o anumita operatie/functie/algoritm.
Daca ne multumeste precizia unei secunde, acest lucru este usor de aflat folosind time_t si functii specifice. Deseori avem insa nevoia de o precizie mai mare. Pentru aceasta, sub Windows, se pot folosi doua functii: QueryPerformanceCounter, respectiv QueryPerformanceFrequency. Este necesar a fi inclus headerul corespunzator: #include <Windows.h> Prima ne returneaza un numar foarte mare ce reprezinta numarul de counteri "trecuti" pana in prezent, iar a doua ne indica cati astfel de counteri sunt numarati pe secunda. Practic apelam QueryPerformanceCounter odata inainte si odata dupa finalizarea operatiei, iar apoi impartim diferenta la rezultatul returnat de QueryPerformanceFrequency, obtinand astfel numarul de secunde trecute. Precizia este foarte buna, la mine fiind de 1/2533304 secunde (0.39 microsecunde) Pentru a simplifica utilizarea, am creat doua macrouri: #define START_COUNTER \ LARGE_INTEGER counter__start, counter__end, counter__frec; \ QueryPerformanceFrequency(&counter__frec); \ QueryPerformanceCounter(&counter__start); #define STOP_COUNTER ((double)(QueryPerformanceCounter(&counter__end), counter__end.QuadPart - counter__start.QuadPart) / counter__frec.QuadPart) Exemplu: START_COUNTER; printf("%u\n", sumaDivizori(0xFFFFFFFF)); double secunde_durata = STOP_COUNTER; //numarul de secunde trecute Solutii pentru alte sisteme de operare/cross-platform sunt bine venite. |
#2
Posted 06 December 2013 - 21:52
Rezultatul ala e in microsecunde. Cred ca ar trebui sa-l inmultesti cu 1000 undeva in definitia macroului ca sa-ti dea milisecunde care sunt mai de folos utilizatorului...
|
#3
Posted 06 December 2013 - 22:11
Conform documentatiei rezultatul e
Quote in counts per second |
#4
Posted 06 December 2013 - 22:50
Poti sa testezi si singur. Masoara cat dureaza de exemplu executia:
sleep (1000)Ia vezi, codul tau iti returneaza 1 sau 1000000? Zic doar pentru ca am folosit acelasi cod dar in Visual Basic si acolo aveam (Stop - Start) * 1000 / Frequency ca sa-mi returneze milisecunde. |
#5
Posted 06 December 2013 - 23:56
dani.user, on 06 decembrie 2013 - 20:53, said:
Practic apelam QueryPerformanceCounter odata inainte si odata dupa finalizarea operatiei, iar apoi impartim diferenta la rezultatul returnat de QueryPerformanceFrequency, obtinand astfel numarul de secunde trecute. Edited by neagu_laurentiu, 06 December 2013 - 23:57. |
#6
Posted 07 December 2013 - 00:29
Pai e cea mai precisa metoda de masurare la care ai acces, alta nu e. Mie mi-a fost foarte folositoare in a descoperi ce parte de cod dureaza prea mult si trebuie optimizata.
|
#7
Posted 07 December 2013 - 09:07
JayBird, on 06 decembrie 2013 - 22:50, said:
Poti sa testezi si singur. Masoara cat dureaza de exemplu executia: sleep (1000)Ia vezi, codul tau iti returneaza 1 sau 1000000? Zic doar pentru ca am folosit acelasi cod dar in Visual Basic si acolo aveam (Stop - Start) * 1000 / Frequency ca sa-mi returneze milisecunde. 1.0006813228716456 Si da, ar trebui inmultit cu 1000 pentru a arata milisecundele. neagu_laurentiu, on 06 decembrie 2013 - 23:56, said:
Dar nu reprezinta timpul exact aferent codului dintre aceste apeluri. El e influentat si de restul aplicatiilor rulate in paralel (real ori simulat). Valorile obtinute sunt altele la fiecare rulare. Nu exact, corect, dar suficient, mai ales daca rulezi de mai multe ori (fara sa rulezi prea multe in paralel) si faci o medie, pentru a avea o idee pe unde te alfii. |
#8
Posted 07 December 2013 - 09:58
Mai bine foloseşti un profiler. Dacă proiectul la care lucrezi nu a ajuns încă la stadiul la care are sens să-i faci profiling, simplele gânduri despre complexitatea algoritmică sunt suficiente.
Compilatoarele folosite de obicei pot instrumenta binarele pentru profiling, în care aş avea mai multă încredere. Profiling pentru unit tests cu code coverage mare (sau măcar lucrurile ştiute a fi lente: algoritmii lenţi sau cele care implică accesul la resurse lente gen hard disk sau reţea) şi eşti în siguranţă. În plus, ţinerea unui ochi pe durata de execuţie a unit tests poate fi automatizată, în special dacă ai şi continuous integration în bucla de dezvoltare. Exemplu, KCacheGrind: [ http://kcachegrind.sourceforge.net/html/pics/KcgShot2.png - Pentru incarcare in pagina (embed) Click aici ] |
#9
Posted 07 December 2013 - 09:59
O solutie de profiling pentru cine nu-si permite versiunile de Visual Studio ce vin cu interfata dedicata pentru asa ceva: http://www.codeproje...al-Studio-for-F
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users