Avatar billede range Nybegynder
27. april 2004 - 20:54 Der er 5 kommentarer

Overflow af clock_t

Hej                                                             

Jeg har et problem med overflow at clock_t variable fra ctime lib'et bliver for store (clock_t svarer normalt til en 32bit integer). Den primære årsag til dette er, at inkrementeringen per sekund (CLOCKS_PER_SEC) er særdeles stor i POSIX miljø'er (hvor jeg blandt andet anvender mine programmer). Størrelsen af CLOCKS_PER_SEC er omkring 1000000, hvilket giver omkring 36 minutter til at måle tiden i.
       
Da mine programmer kan tage alt fra et par sekunder til adskillige 100 timer, så vil jeg høre om, der er nogle, som har en idé til, hvorledes man kan få en bedre timing. Kravene til denne er følgende:
1) Skal være platformsuafængigt, da jeg anvender programmerne i både Linux og Windows, og det skal kunne anvendes på forskellige processortyper.
2) Skal kunne måle tiden præcist både ved korte og lange kørsler (Her mener jeg den forbrugte CPU tid og ikke realtid).                                                                                                                        Begge ting kunne være opflydt hvis clock_t var en 64bit integer eller hvis CLOCKS_PER_SEC kunne sættes ned til noget mindre. Dog er den første klart at foretrække.

/range
http://cpp.range.dk
Avatar billede arne_v Ekspert
27. april 2004 - 21:04 #1
En nem løsning hvis du har mulighed for det var at erstatte:

clock_t t1 = clock();
a();
b();
c();
clock_t t2 = clock();
int t = (t2-t1)/CLOCKS_PER_SEC;

med:

clock_t t1,t2;
int t = 0;
t1 = clock();
a();
t2 = clock();
t = t + (t2-t1)/CLOCKS_PER_SEC;
t1 = clock();
b();
t2 = clock();
t = t + (t2-t1)/CLOCKS_PER_SEC;
t1 = clock();
c();
t2 = clock();
t = t + (t2-t1)/CLOCKS_PER_SEC;
Avatar billede arne_v Ekspert
27. april 2004 - 21:05 #2
Alternativt skal du nok have lavet en myclock som så er implementeret med
#ifdef til forskellige platforme.
Avatar billede segmose Nybegynder
28. april 2004 - 11:57 #3
Brug time() functionen der returnerer en time_t til at afgøre om det er lang tids måling du skal bruge eller kort tid, dvs. hvis tiden er >36 min bruges kun time_t functioner ellers regnes på clock.
Avatar billede range Nybegynder
28. april 2004 - 15:44 #4
Hej igen - takker for svarene :-)

De ser dog ikke ud til at fungere efter hensigten:

arne_v -> funktionerne a(), b() og c() har en ukendt køretid (og måske >36 minutter), dvs. der sker et overflow af clock_t, hvis blot en af dem anvender mere end 36 minutter. Så den simple løsning (som jeg også selv havde overvejet) er desværre ikke en mulighed.

sergmose -> Så vidt mig bekendt angiver time_t og time() tidspunktet og ikke cpu-tiden. Det kan give væsentlige fejl, hvis applikationen køres på en maskine, hvor flere programmer er kørende.

Konsekvensen er nok (hvis der ikke er nogle der har bedre idéer), at jeg sætter mig på min flade ... og laver en myclock i en 64bit udgave.

/range
Avatar billede segmose Nybegynder
28. april 2004 - 17:21 #5
Så må du lave de passende operativ system kald for hvert OS du vil køre det på og så lave nogle "ifdef"'er omkring det.

Eller du kan i linux/unix forsøge med:

#time ditprogram
real 0m2.902s
user 0m0.080s
sys  0m0.010s
#
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester