Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bestimmung der Dauer einer Function/Prozedur (https://www.delphipraxis.net/24786-bestimmung-der-dauer-einer-function-prozedur.html)

n1d3c 26. Jun 2004 07:20


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?

toms 26. Jun 2004 07:32

Re: Bestimmung der Dauer einer Function/Prozedur
 
Hi,

Zitat:

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 )?
Stichwort: Hier im Forum suchenQueryPerformanceCounter

Zitat:

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?
Ablösung schafft da Hier im Forum suchenApplication.Processmessages
(Evtl. in Kombination mit Sleep() o.ä. Lies dir mal frühere Threads dazu durch)

SirThornberry 26. Jun 2004 07:32

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]

bernd2000 26. Jun 2004 07:40

Re: Bestimmung der Dauer einer Function/Prozedur
 
Hi

Am besten mit QueryPerformanceCounter:

Code:
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;
Gruß Bernd

n1d3c 26. Jun 2004 08:04

Re: Bestimmung der Dauer einer Function/Prozedur
 
Danke für die schnelle Hilfe, funzt bestens :)

MrKnogge 26. Jun 2004 10:13

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 ?

bernd2000 26. Jun 2004 10:26

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

tommie-lie 26. Jun 2004 12:43

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:

Zitat von n1d3c
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?

toms' Lösung funktioniert zwar auch, die "richtige" Lösung ist aber ein [dp]"Thread"[/dp] oder [df]"Thread"[/df]

n1d3c 27. Jun 2004 15:56

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 :?

Nikolas 27. Jun 2004 16:08

Re: Bestimmung der Dauer einer Function/Prozedur
 
Zitat:

1,2239359345.3344E-34
Das bedeutet so viel wie 1,22... *10^-34, ist also so ziemlich genau 0.
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

n1d3c 27. Jun 2004 16:25

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?

Daniel G 30. Jun 2005 20:25

Re: Bestimmung der Dauer einer Function/Prozedur
 
Zitat:

Zitat von n1d3c
Eine weitere Frage: Was bewirkt der Typ extended?

Das du für diese Frage einen neuen Thread aufmachen solltest und man dir dort wahrscheinlich sagen wird, dass du nach Delphi-Referenz durchsuchenExtended suchen solltest.

tommie-lie 30. Jun 2005 20:32

Re: Bestimmung der Dauer einer Function/Prozedur
 
Zitat:

Zitat von Daniel G
Das du für diese Frage einen neuen Thread aufmachen solltest und man dir dort wahrscheinlich sagen wird, dass du nach Delphi-Referenz durchsuchenExtended suchen solltest.

Richtig, und daß du auf eine solche Frage nicht mehr antworten brauchst und dein Post somit überflüssig ist, sagt dir ein Blick auf das Datum...

Daniel G 30. Jun 2005 20:38

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