AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetTickCount / Fehler bei Bereichsprüfung

Ein Thema von Andidreas · begonnen am 15. Jan 2014 · letzter Beitrag vom 16. Jan 2014
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#21

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 17:07
QueryPerformanceCounter scheint aber auch ein paar Macken zu haben.

In dem Testprojekt vom himXML hatte ich das drin und auf meinem neuen i7 gibt das Ding keine verwertbaren Ergebnisse mehr raus, bzw. die Werte (also Count / Freq) stimmten absolut nicht.
z.B. Mehere Sekunden bis Tage ausgerechnet, aber real nur paar Millisekunden gelaufen oder auch mal andersrum.
Woran das lag, hatte ich auf die Schnelle nicht rausbekommen. (lag eventuell am Switchen der Treads in den 8 Kernen oder am ständigen hoch und runtergetackte der Kerne oder ein bug im Delphi)


Und den RealTimeStampCounter kann man uch schon länger nicht mehr verwenden, seitdem die CPUs dynamisch tackten und da wo der Counter-Takt an den CPU-Tackt gekoppelt ist.
Wenn er überall an die CPU gekoppelt wäre, hätte man damit wenigstens noch die "reale" CPU-Zeit messen können, aber das geht so ja nun auch nicht.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#22

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 17:14
d.h. was würdet ihr vorschlagen?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#23

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 17:15
Ich hatte das mal so gelöst:

Delphi-Quellcode:
function TimeDiff(TickCount: Cardinal): Cardinal;
begin
  {$ifopt Q+}{$define recoveroverflowcheck}{$Q-}{$endif}
  Result := GetTickCount - TickCount;
  {$ifdef recoveroverflowcheck}{$Q+}{$endif}
end;
Diese Funktion kann nur eine maximal Zeitdifferenz von besagten 49 Tagen auswerfen. Wie lange der Rechner läuft spielt aber keine Rolle.
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#24

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 17:21
Meine Lösung wäre jetzt die folgende um über den QueryPerformanceCounter ein Performance Ergebnis in Sekunden zu bekommen:

Delphi-Quellcode:
var
intEnd, intFreq, intStart : Int64;

If gsPerformCheck = 'YESThen QueryPerformanceCounter(intStart);

If gsPerformCheck = 'YESThen
Begin
  QueryPerformanceCounter(intEnd);
  gdblTimeDiff := (((intEnd - intStart)/intFreq) * 1000) / 1000;
  prMsgLog(MySQL_Database, tyINF, 99999, '', FloatToStrF(gdblTimeDiff, ffFixed, 5, 3), 'Delete Master Data Tables', gbBlckInfoMsg);
End;
Die Berechnung müsste doch so stimmen???
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#25

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 17:30
Wenn sich intFreq aus QueryPerformanceFrequency ergibt, müsste das stimmen. Aber wieso erst mit 1000 multiplizieren und dann wieder dividieren?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#26

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 17:36
uups hab was vom source vergessen, hier nochmal komplett:

Delphi-Quellcode:

var
intEnd, intFreq, intStart : Int64;

QueryPerformanceFrequency(intFreq);

If gsPerformCheck = 'YESThen QueryPerformanceCounter(intStart);

If gsPerformCheck = 'YESThen
Begin
  QueryPerformanceCounter(intEnd);
  gdblTimeDiff := (intEnd - intStart)/intFreq;
  prMsgLog(MySQL_Database, tyINF, 99999, '', FloatToStrF(gdblTimeDiff, ffFixed, 5, 3), 'Delete Master Data Tables', gbBlckInfoMsg);
End;
Keine Ahnung warum ich erst Multipliziert und dann wieder Dividiert hab
Liegt wohl an der Uhrzeit das ich schon etwas verwirrt bin
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#27

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 22:39
Und das hier funktioniert nicht?
Delphi-Quellcode:
Function ElapsedTicks (previousTicks : Cardinal) : Cardinal;
Var
   currentTicks : Cardinal;

Begin
   currentTicks := GetTickCount();
   if currentTicks < previousTicks then
     result := High(Cardinal) - previousTicks + currentTicks + 1
   else
     result := currentTicks - previousTicks
end;



Var
  start : Cardinal;
...
begin
  start := GetTickCount;
  SomeOperation();
  Writeln('Tics elapsed:',ElapsedTicks(start));
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#28

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 16. Jan 2014, 09:39
Ab, glaube ich, XE2 würde es noch die Möglichkeit der TStopWatch geben:

Delphi-Quellcode:
var
  MyStopWatch : System.Diagnostics.TStopwatch;
  ElapsedTimeInMilliSeconds : Int64;
  ElapsedTimeInSeconds,
  ElapsedTimeInMinutes,
  ElapsedTimeInHours,
  ElapsedTimeInDays : Double;
begin
  MyStopWatch := TStopwatch.StartNew;

  Sleep(10000);

  MyStopWatch.Stop;

  ElapsedTimeInMilliSeconds := MyStopWatch.ElapsedMilliseconds;
  ElapsedTimeInSeconds := ElapsedTimeInMilliSeconds / 1000;
  ElapsedTimeInMinutes := ElapsedTimeInSeconds / 60;
  ElapsedTimeInHours := ElapsedTimeInMinutes / 60;
  ElapsedTimeInDays := ElapsedTimeInHours / 24;
end;
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#29

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 16. Jan 2014, 11:31
Und das hier funktioniert nicht?
Delphi-Quellcode:
Function ElapsedTicks (previousTicks : Cardinal) : Cardinal;
Var
   currentTicks : Cardinal;

Begin
   currentTicks := GetTickCount();
   if currentTicks < previousTicks then
     result := High(Cardinal) - previousTicks + currentTicks + 1
   else
     result := currentTicks - previousTicks
end;



Var
  start : Cardinal;
...
begin
  start := GetTickCount;
  SomeOperation();
  Writeln('Tics elapsed:',ElapsedTicks(start));
Wenn man die Überlaufprüfung ausschaltet dann ist
result := High(Cardinal) - previousTicks + currentTicks + 1
equivalent zu
result := High(Cardinal) + 1 - previousTicks + currentTicks
equivalent zu
result := 0 - previousTicks + currentTicks
equivalent zu
result := currentTicks - previousTicks.
Die Fallunterscheidung ist dann also unnötig.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#30

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 16. Jan 2014, 12:23
Die Fallunterscheidung ist dann also unnötig.
Jupp, aber ob er dann verständlicher wird? Ein Programmierer, dem der Überlauf auffällt, benötigt dann auch ein Weilchen, um das zu verstehen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz