Jeg har skrevet nogle rutiner som jeg gerne vil teste tidsforbruget på. Jeg har prøvet med funktionerne NOW og GETTICKCOUNT, men de returnerer kun hundrededele sekunder 10,20,30 o.s.v. Hvordan løser jeg dette problem ?
function TFastTime.GetTimeStamp: Int64; var TimeStamp : Record case byte of 1 : (Whole: Int64); 2 : (LO, HI : longint); end; begin asm db $0F; db $31; mov [TimeStamp.LO], eax mov [TimeStamp.HI], edx end; Result:=TimeStamp.Whole; end;
Procedure TFastTime.Start(Measurement : TMeasurement = Seconds); begin fMeasurement := Measurement; if Measurement = Seconds then begin QueryPerformanceFrequency(Frequency); QueryPerformanceCounter(StartTime); end else RDTSC_START := GetTimeStamp; end;
Procedure TFastTime.Stop; begin if fMeasurement = Seconds then begin QueryPerformanceCounter(EndTime); FElapsedTime:= format(\'Seconds: %g\', [(EndTime - StartTime)/ Frequency]); end else begin RDTSC_STOP := GetTimeStamp; FElapsedTime:= format(\'Clock Cycles: %.0n\', [RDTSC_STOP - RDTSC_START]); end; end; end.
unglebug :>> Ikke helt hvis du måler i Click cycles og kender din præcise Clock frekvens så op når du højere nøjagtighed .... Min kalsse kan bruge begge dele ....
Jeg vil give dig ret i at din er lige så præcis, men det fåes ikke mere præcist end QueryPerformanceCounter. Din GetTimeStamp gør formentlig det samme som den, så jeg kan ikke se hvorfor det er nødvendigt at bruge Asm (ikke at jeg har noget imod det, Asm rules).
Det ER clockfrekvensen på cpu\'en der bruges. Jeg har rundet det af til millisekunder, for det er nemmere at relatere til, men den er langt mere præcis end det. Den aflæser direkte fra CPU\'en (virker kun på Pentium og nyere).
unclebug >> De to klasser (din og min9 gør det samme hvis du altså beder min om at måle i sekunder .... Grunder til jeg bruger ASM er jeg også giver brugeren mulighed for at måle i clock cycles ... DET skal man bruge asm til
QueryPerformanceCounter(Stamp1) ... do some stuff QueryPerformanceCounter(Stamp2)
Elapsed := Stamp2 - Stamp1;
Faktisk er jeg ikke helt sikker på om det er clockcycles det tælles her, men det burde det være. Det er CPU\'ens interne tæller. Er det ikke muligt at det kode du har også virker på 486 m.m.? For det gør performancecounter ikke.
Det er spm. for hvis du kigger i hjælpen, så taler de om millisec. og hvad skulle man også med en DateTimeToTimeStamp hvis ikke du fik et brugbart resultat
procedure TMainForm.Button6Click(Sender: TObject); var i : integer; Val :array[0..9] of TDateTime; Stamp : TDateTime; begin for i:=0 to 9 do begin Stamp := Now; repeat until Now > Stamp; Val[i] := Stamp; end;
for i:=0 to 9 do begin Memo1.Lines.Add(inttostr(DateTimeToTimeStamp(Val[i]).Time)); end; end;
I min Win2K springer den 10ms., det samme som GetTickCount.
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.