Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr.
Seite 1 von 2  1 2      

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