[język C] Linux - pomiar czasu działania programu w milisek


(Gregorcowo) #1

Witam!

Poniższy program kopiuje plik do innego pliku docelowego, oraz mierzy czas trwania tej operacji w setnych częściach sekundy.

(nazwy plików podajemy jako argumenty <źródło> ).

Docelowo ma mierzyć ten czas w milisekundach.

Kombinowałem z gettimeofday(), tylko nie wiem przez co potem dzielić:

duration = (double)(finish-start) / CLOCKS_PER_SEC;

ponieważ to rozwiązanie nic nie daje. Po zastosowaniu zamiast clock() - gettimeofday(), czas nie jest w ogóle liczony. Jeśli ktoś miałby jakiś pomysł, to będę bardzo wdzięczny! Pozdrawiam. kompilator - gcc system - Ubuntu Linux 7.10

# include 

# include 

# include 

# define MAX 512


int main(int argc, char* argv[]){

char buf[MAX];

int desc_zrod, desc_cel;

int lbajt;


// Poczatek pomiaru czasu

clock_t start, finish;

double duration;

start = clock();

// ----------------------


if (argc<3)

{

fprintf(stderr, "Za malo argumentow. Uzyj:\n");

fprintf(stderr, "%s \n", argv[0]);

exit(1);

}



desc_zrod = open(argv[1], O_RDONLY);

if (desc_zrod == -1)

{


perror("Blad otwarcia pliku zrodlowego");

exit(1);

}


desc_cel = creat(argv[2], 0640);


if (desc_cel == -1

{

perror("Blad utworzenia pliku docelowego");

exit(1);

}


while((lbajt = read(desc_zrod, buf, MAX)) > 0)

{

if (write(desc_cel, buf, lbajt) == -1)

{

perror("Blad zapisu pliku docelowego");

exit(1);

}

}

if (lbajt == -1){

perror("Blad odczytu pliku zrodlowego");

exit(1);

}

if (close(desc_zrod) == -1 || close(desc_cel) == -1)

{

perror("Blad zamkniecia pliku");

exit(1);      

}                                                                  



// Koniec pomiaru czasu

finish = clock();

duration = (double)(finish-start) / CLOCKS_PER_SEC;

printf("\n Czas wykonania programu %2.5f setnych_sekundy\n", duration);

// ----------------------


exit(0);


}

(Fiołek) #2

Błąd jest w tym, że jeśli chcesz wyliczyć setne sekundy to nie dzielisz przez CLOCKS_PER_SEC, tylko przez (CLOCK_PER_SEC / 100), bo CLOCKS_PER_SEC to liczba tyknięć zegara na jedną sekundę a nie setną sekundy. Wyniku może ni pokazywać, bo jest bardzo mały.


(Gregorcowo) #3

@Fiołek:

Czytaj proszę dokładnie.

MAM już czas mierzony w setnych sekundy, a chce, by był mierzony w MILISEKUNDACH.

1 setna sek = 0.01 s

1 milisekunda = 0.001 s

W moim przypadku nic nie da podzielenie (CLOCK_PER_SEC / 100) - pomiar czasu nigdy nie osiągnie dokładności milisekund.

Będzie np.:

0.190 sek

0.080 sek

0.120 sek

Ale nie będzie nigdy ŻADNEJ cyfry na miejscu 0.00X. A o to właśnie chodzi :confused:

Wynik badam na sporych plikach, >5MB więc brak dokładności co do milisekund, jest spowodowany błędem w sposobie pomiaru czasu - i tutaj właśnie potrzebuje rady.

Pozdrawiam!