Bestimmung der Dauer einer Function/Prozedur
Hi erstmal, ich bin neu in diesem Forum und ich hoffe einer kann meine kleine Frage beantworten =)
Ich möchte messen wielange bestimmte Prozeduren brauchen. Gibt es in Delphi eine Möglichkeit ( eine Komponente ) die man in eine Prozedur einbauen kann und die mir automatisch mitteilt wielange diese Prozedur lief ( auf milisekunden genau )? Ausserdem habe ich oft das Problem das bei großen Berechnungen der Rechner nicht mehr reagiert bis die Prozedur ausgeführt worden ist, weiss hier einer Rat um das zu verhindern? |
Re: Bestimmung der Dauer einer Function/Prozedur
Hi,
Zitat:
Zitat:
(Evtl. in Kombination mit Sleep() o.ä. Lies dir mal frühere Threads dazu durch) |
Re: Bestimmung der Dauer einer Function/Prozedur
Schau dir dazu am besten "QueryPerformanceCounter()" und "QueryPerformanceFrequency()" an. Mit diesen funktionen kann man den meisten fällen die zeit mehr als genau bestimmen
[Edit]Wie so oft zu langsam gewesen :cry: [/Edit] |
Re: Bestimmung der Dauer einer Function/Prozedur
Hi
Am besten mit QueryPerformanceCounter:
Code:
Gruß Bernd
procedure DoStart;
var c,n1,n2: TLargeInteger; i: Integer; begin QueryPerformanceFrequency(c); QueryPerformanceCounter(n1); for i:=1 to 100000 do begin //Irgendwas end; QueryPerformanceCounter(n2); ShowMessage(Format('Dauer: %g',[(n2-n1) / c])); end; |
Re: Bestimmung der Dauer einer Function/Prozedur
Danke für die schnelle Hilfe, funzt bestens :)
|
Re: Bestimmung der Dauer einer Function/Prozedur
Man könnte dies ja auch mit GetTickCount machen, aber QueryPerformanceCounter ist sicher genauer, empfielt es sicher eventuell auch QueryPerformanceCounter beispielsweise zum messen von Sortier-Verfahren zu verwenden ?
|
Re: Bestimmung der Dauer einer Function/Prozedur
Hallo MrKnogge
GetTickCount ist viel zu ungenau, da der Counter nur alle 10ms(>WinNT 3.5) abgefragt wird. Das beste das ich kenne ist QueryPerformanceCounter (Genauigkeit: 0,00083 ms) Gruß Bernd |
Re: Bestimmung der Dauer einer Function/Prozedur
GetTickCount hat nur eine Auflösung von Millisekunden, der Performance Counter hat eine sehr viel höhere Frequenz. Der Performance Counter muss auf dem Board vorhanden sein (ist aber in allen Boards >5Jahre gegeben), kann aber von System zu System verschiedene Auflösungen haben (je nach verwendetem Taktgenerator), dafür gibt's ja die QueryPerformanceFrequency(). Laut SDK kann es auf Multiprozessorsystemen Probleme geben, da sollte man den laufenden Thread an einen Prozessor koppeln und dem Scheduler nicht erlauben, den Prozessor zu wechseln (SetThreadAffinityMask).
Zitat:
|
Re: Bestimmung der Dauer einer Function/Prozedur
Hallo nochmal,
Danke nochmals für die schnelle und kompetente Hilfe. Ich habe nun noch 2 weitere Fragen, wobei sich die 2te aus der ersten ergibt. 1. Frage: Mein Programm rechnet mit sehr hohen Zahlen ( int64, real reicht ab einer bestimmten anfangszahl nicht mehr aus.. [ zur Information mein Programm errechnet F(n,p,k)... Binomialverteilungen]. Das problem ist das als Ergebniss abundzu eine Zahl heraus kommt der Form: 3,2344940...(14 stellen)E32 oder E-12 [also 1,2239359345.3344E-34]. Wie kann ich diese Zahl interpretieren? 2. Frage: Eine Zahl dieser Form ergibt sich schon bei einigen Zwischenrechnungen in der Funktion. Angenommen eine Zahl dieser Form kommt bei einer Zwischenrechnung heraus und wird dann mit einer anderen Zahl multipliziert,dividiert, oder der gleichen... errechnet der Computer dabei den richtigen Wert oder kann er mit der Zahl nicht wirklich was anfangen und gibt somit ein falsches Endergebniss heraus? Ich weiß dass diese Frage evt. für einige dumm klingen mag, aber ich bin ein Neuling und habe in meinem Delphi-Buch ( ist eben für Einsteiger ) keine passende Antwort zu dieser Frage gefunden :( Ich hoffe einer von euch kann mir helfen :? |
Re: Bestimmung der Dauer einer Function/Prozedur
Zitat:
10^-1=0,1 10^-2=0,0^1 10^-34=0,000000000000000000000000000000000000000000000 0001 (nicht nachgezählt :mrgreen: ) zur zweiten Frage: laut F1 geht INT64 von -2^63 bis 2^63 -1 und hat 64 Bit zur Verfügung. Also wird eine größere/kleiner Zahl ungenau angegeben. Du kannst also je nach benötigter Genauigkeit alle Folgeergebniss vergessen. Es gibt aber Units, die auch sehr viel größere Zahlen verarbeiten können, also mal hier oder bei Google schauen. TOX |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 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