16. maj 2006 - 11:38Der er
18 kommentarer og 2 løsninger
Tidstagning i C++
Hej eksperter..
Jeg har en funktion i C++, der indlæser nogle værdier fra com-porten. Det vil være forskelligt, hvor mange værdier, der indlæses, og jeg skal bruge den tid, det tager, at få indlæst værdierne.
Er der en funktion, jeg kan sætte i gang, når første værdi modtages og stoppe, når den sidste værdi er modtaget, og så beregne, hvor lang tid dette har taget?
Problemet er lidt, at den skal tælle mere nøjagtigt en sekunder.. Den skal faktisk ned og tælle i millisekunder! Vi har et input af der, der bliver gemt i et array. Timeren skal starte, når det første tal skrives til arrayet og stoppe, når det sidste tal er lagret. Håber, det er til at forstå :)
bertelbrander >> Det bliver jo ikke mere præcist af, at du ganger tllet med 1000.. Så vil du bare få værdierne 1000, 2000, 3000, 4000 osv. Du vil aldrig kunne få den til at vise 2384 for eksempel.
Nej, den bliver ikke mere nøjagtig af at man ganger med 1000, resultatet bliver blot vist i ms i stedet for sekunder.
Men den har en opløsning der er meget bedre end millisekunder, så den kan godt måle 2384 ms.
Den skriver ikke bare 1000, 2000, 3000, 4000 osv. Det ville den gøre hvis Freq.QuadPart var 1, men den er mange gange større, som jeg skrev er den 3579545 på min PC.
Den skriver resultatet som en double.
Prøv en gang at køre koden og se hvad den skriver.
Hvis jeg var dig så ville jeg bruge CPUens Time Stamp Counter (TSC). Du får ikke tiden i sekunder, men i clock cycler. Om du kan bruge det i stedet ved jeg ikke, men hvis ikke kan du altid omregne det til tid senere.
Denne metode er uafhængig af styresystemet og du kan ikke komme i nærheden af samme præcision med nogle af de andre forslag.
Note: Du skal være sikker på at CPUen understøtter 'rdtsc' instructionen (det gør alle AMD CPUer i Athlon familien og alle Intel CPUer fra Pentium af) samt at fx. styresystemet ikke har lavet restriktioner på brugen af instructionen (som default gør windows ikke).
rdtsc instructionen bliver ikke automatisk serialized. Dvs. at hvis du skal være sikker på at rdtsc ikke "overhaler" andre instructioner i CPUens pipeline, så skal du først eksekvere en serialiserende instruction som fx 'cpuid': __asm { cpuid rdtsc ; Read Time Stamp Counter (value stored in EDX:EAX) mov DWORD PTR[tsc], eax mov DWORD PTR[tsc+4], edx }
Jeg tvivler på at du har brug for at regne så præcist, men man ved jo aldrig...
Den giver det samme resultat. Det er jo clock >frekvensen< der justeres. Antallet af clocks ændres ikke.
Men hvis man selv finder frekvensen og skal omregne clocks til tid, så skal man selvfølgelig tage højde for ændringer i frekvensen - hvis det sker, det kommer jo an på systemet.
Jeg skal faktisk ikke kunne sige, hvad det endte med.. Det var til et skole-projekt, og det var ikke lige mig, der stod for C++-delen.. Jeg forsøgte bare at hjælpe dem :)
Synes godt om
Ny brugerNybegynder
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.