Pagina informaticii

Teste de informatică pentru liceu, articole C#, C/C++, PHP

Măsurarea timpului de execuţie

Apare deseori în practică necesitatea măsurării timpului de execuţie al unui program în C/C++. Acest lucru necesită utilizarea funcţiei clock() care se găseşte în biblioteca <ctime> şi care are antetul:

 clock_t clock ( ) 

Funcţia nu are parametri. Returnează numărul de tic-uri ale ceasului trecute de la execuţia programului. Pentru a calcula efectiv timpul de execuţie a unei secvenţe de program, funcţia clock() trebuie apelată de fapt de două ori: o dată la începutul secvenţei, a doua oară la final:

  clock_t timpInitial, timpFinal ;
  timpInitial = clock() ;
  // aici se scrie secventa de program căreia i se măsoară timpul
  timpFinal = clock() ;
  cout<< (double)(timpFinal - timpInitial)/ CLOCKS_PER_SEC ;

Facem aici următoarele observaţii:

1. clock_t este un tip întreg, deci variabilele timpInitial şi timpFinal puteau fi declarate long şi în acest caz la atribuirea timpInitial = clock() s-ar realiza conversia implicită de la tipul clock_t la tipul long.

2. CLOCKS_PER_SEC este un macro care reprezintă numărul de tic-uri ale ceasului într-o secundă. În locul acestui macro se putea utiliza CLK_TCK, considerat învechit (în engleză, obsolete)

3. Deoarece clock_t este tip întreg, pentru a determina corect timpul de execuţie în expresia
(double)(timpFinal - timpInitial)/ CLOCKS_PER_SEC ; este necesară conversia explicită la un tip real, altfel împărţirea ar fi considerată pe numere întregi, deci o expresie de forma:

  (timpFinal -  timpInitial)/ CLOCKS_PER_SEC ;
ar furniza doar numărul de secunde, nu şi secimi, sutimi etc.

În continuare prezint un program simplu care determină timpul de execuţie al unei instrucţiuni repetitive (este recomandată includerea header-ului ctime)

#include<iostream>
#include<ctime>
using namespace  std;
int main()
{
   clock_t start, stop ;
   start = clock();
   for (int i=1 ; i<=500000000 ;  i++)
        ;
   stop = clock() ;
   cout<<(double)(stop-start)/CLOCKS_PER_SEC  ;
return 0; }

 

Despre autor
Author

Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică

Comentarii (2)
  • Avatar

    Republica 16-11-2010 20:13:23

    As vrea sa aflu ceva. Am aplicat functia clock() exact asa cum a fost descrisa aici pe o secventa de program backtracking, cam asa ceva:

    clock_t start, stop ;

    start = clock();

    back(1);

    stop = clock() ;

    cout<<(double)(stop-start)/CLOCKS_PER_SEC ;


    Rezultatul este 0, inteleg de aici ca este de tip intreg, deci afiseaza doar secundele. Ce se intampla? Nu am facut corect conversia? Daca se poate, as fi foarte bucuroasa sa primesc un raspuns. Multumesc!

  • Avatar

    Dan Pracsiu 17-11-2010 15:4:50

    E corecta valoarea 0. Probabil datele de intrare erau mici si de aceea programul s-a executat instantaneu. Ar trebui date mai mari ca sa dea cu virgula. Timpul nu este masurat la milionimi de secunda totusi!

Scrie un comentariu
Nume:

Comentariu:

15 + 10 =