![]() |
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 |
Re: Bestimmung der Dauer einer Function/Prozedur
Danke für die schnelle Antwort =)
Wobei ich mich jetzt frage wieso bei mir einige male 1,22...E23 rauskam... das würde ja heissen 10^23...dabei kann die wahrscheinlichkeit aber nie grösser als 1 werden :? hmpf :wall: evt. weil die zwischenerg. ungenau waren... ich werde mich dann mal auf die suche nach diesen units begeben :) --- edit ---- Oke. Mein Programm funktioniert soweit... das Problem ist anscheinend, dass wenn die Zahl zu hoch wird ( ich benutze nicht int64 an dieser stelle sondern Real ),dass der Wert dann falsch errechnet wird und dadurch bei weitem grösser wird als 1 ;) ( oder eher als paar millionen ^^ ), hängt das evt. damit zusammen das die zahlen intern mit 001101 dargestellt werden und die positiven Zahlen und negativen Zahlen in einem "Kreis" zusammenhängen?...ist an sich unwichtig...würde mich nur interessieren]. Falls ich mit dieser Annahme richtig liege, gibt es eine Möglichkeit den Wert den Real annehmen kann zu erhöhen oder im Falle einer Überschreitung das Ergebniss gleich null zu setzen? Wobei das Programm doch eigentlich bei einer Überschreitung mit der Fehlermeldung "FlaotingPointOverflow" oder der gleichen aussteigen müsste?! Eine weitere Frage: Was bewirkt der Typ extended? |
Re: Bestimmung der Dauer einer Function/Prozedur
Zitat:
![]() |
Re: Bestimmung der Dauer einer Function/Prozedur
Zitat:
|
Re: Bestimmung der Dauer einer Function/Prozedur
:oops: Verdammt. Sorry, war keine Absicht, bin die aktuellen Threads durchgegangen und der ist in meinen Tabs irgendwie offen gewesen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz