Autor |
Beitrag |
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 08.04.09 13:18
Hi,
also ich würde gerne Dauer von funktionen etc. Messen .
Leider habe ich nur Möglichkeiten gefunden die im ms Bereich liegen.
Und ich hätte das ganze gerne im Mikrosekunden bereich oder genauer.
Weis zufällig jemand ob es da etwas gibt?
Vielen Dank im vorraus.
mfg nic Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 08.04.2009 um 19:11
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 08.04.09 13:20
QueryPerformanceCounter und QueryPerformanceFrequency
Siehe Forensuche
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
thepaine91 
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 08.04.09 13:21
Dankeschön vil hab ich mich unglücklich angestellt beim Suchen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 08.04.09 22:30
Wobei du in der Größenordnung verlässliche Werte nur bei vielen Durchläufen hintereinander bekommst bei denen du die Gesamtzeit nimmst und durch die Anzahl der Durchläufe teilst.
|
|
sky21
      
Beiträge: 141
W7
D2010, XE2
|
Verfasst: Mi 08.04.09 23:10
jaenicke hat folgendes geschrieben : | Wobei du in der Größenordnung verlässliche Werte nur bei vielen Durchläufen hintereinander bekommst bei denen du die Gesamtzeit nimmst und durch die Anzahl der Durchläufe teilst. |
Wie kommst du zu dieser Aussage?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 08.04.09 23:28
Erstens rein logisch, weil die Zeitmessung selbst Zeit benötigt und bei derart kleinen Zeitintervallen auch sehr stark eine kurzzeitige Aktivität von anderen Programmen oder Windows die Zeiten verändert.
Zweitens, weil ich es aus eigener Erfahrung gemerkt habe, dass einzelne Messungen keine verwertbaren Ergebnisse liefern, weil diese ständig verschiedene Werte lieferten.
Zuletzt bearbeitet von jaenicke am Mi 08.04.09 23:29, insgesamt 1-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 08.04.09 23:29
Weil Windows preemptiv und nicht kooperativ ist.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
sky21
      
Beiträge: 141
W7
D2010, XE2
|
Verfasst: Mi 08.04.09 23:36
jaenicke hat folgendes geschrieben : | Erstens rein logisch, weil die Zeitmessung selbst Zeit benötigt und bei derart kleinen Zeitintervallen auch sehr stark eine kurzzeitige Aktivität von anderen Programmen oder Windows die Zeiten verändert.
Zweitens, weil ich es aus eigener Erfahrung gemerkt habe, dass einzelne Messungen keine verwertbaren Ergebnisse liefern, weil diese ständig verschiedene Werte lieferten. |
Ahh verstehe.
hmm. Noch wegen dem preemptiv'en verhalten: Kann das OS den Thread auch unterbrechen, wenn ich in einer Critical Section stecke? Wenn nein, dann könnte man ja den Code zwischen Aquire->Release packen und gut iss.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 08.04.09 23:39
Ja, kann das OS, da Critical Sextions nur einen Ressourcenschutz realisieren ... Der Thread läuft normal weiter und kann wie gewohnt unterbrochen werden (Im Gegensatz zu Disable Interrupt, was Maskable Interrupts der CPU deaktiviert).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
thepaine91 
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 28.04.09 13:12
Hi,
also ich habe das jetzt mal probiert. Ist schön und gut er gibt mir zwar Werte in dem Bereich aus hier mal mein Ergebnis. Was haltet ihr davon?
Ich hab damit noch nicht gearbeitet wie kommen die Unterschiede zu stande und sind die messwerte verlässlich, usw... Über zahlreiche qualitative Antworten würde ich mich freuen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var Frequenz, Start, Stop, Startinsgstart, startinsgstop: int64; Insgesamt: Extended; I: integer;
QueryPerformanceFrequency(Frequenz); QueryPerformanceCounter(Startinsgstart); for i:= 1 to 100 do begin QueryPerformanceCounter(Start); insgesamt := 1+1+1+1+1+1+1+1; insgesamt := strtofloat(floattostr(insgesamt)+ '1'); insgesamt := strtofloat(floattostr(insgesamt)+ '1'); insgesamt := strtofloat(floattostr(insgesamt)+ '1'); insgesamt := strtofloat(floattostr(insgesamt)+ '1'); QueryPerformanceCounter(Stop); Meinarray[i] := (Stop - Start) / Frequenz * 1000000; end; QueryPerformanceCounter(startinsgstop); |
Der Durchschnitt = 6,32482619997793
Insgesamte Laufzeit der Schleife = 781,663591322361
Alle Werte:
15,6444464310408 ||||| 6,70476275616035 ||||| 6,70476275616035 ||||| 6,42539764132034 ||||| 6,70476275616035
6,42539764132034 ||||| 6,42539764132034 ||||| 6,14603252648032 ||||| 6,42539764132034 ||||| 6,42539764132034
6,42539764132034 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
10,0571441342405 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,42539764132034 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 5,86666741164031 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 5,86666741164031 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 8,10158833036042 ||||| 6,14603252648032 ||||| 6,14603252648032
6,14603252648032 ||||| 6,14603252648032 ||||| 5,86666741164031 ||||| 5,86666741164031 ||||| 6,14603252648032
Wobei der 1. Wert sehr raussticht könnte jetzt vermuten warum aber mehr auch nicht.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 28.04.09 13:19
Windows ist ein MULTItasking-Betriebssystem ... und andere Prozesse brauchen halt auch Zeit ... Und auch das Scheduling läuft nicht ganz ohne ab ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
thepaine91 
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 28.04.09 13:49
Hm okay dann noch eine Frage welcher Wert ist jetzt der realitischste?
Es wird ja immer gesagt der mittelwert aber letzendlich ist doch der niedrigste der beste.
Denn da wurde der Prozess am wenigsten gestört? Oder sehe ich das falsch?
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 28.04.09 13:52
thepaine91 hat folgendes geschrieben : | Der Durchschnitt = 6,32482619997793
Insgesamte Laufzeit der Schleife = 781,663591322361 |
Falsch  Du darfst nicht den Durchschnitt der ganzen Werte messen, sondern musst die Gesamtzeit durch die Anzahl an Durchläufen teilen. Hier also 781/100 = 7,81 ms
thepaine91 hat folgendes geschrieben : | Wobei der 1. Wert sehr raussticht könnte jetzt vermuten warum aber mehr auch nicht. |
Die höchste Auflösung die du erreichen kannst, liegt ziemlich genau bei den 6 Millisekunden die du gemessen hast. Soll heißen: Der Zähloer, den du abfragt wird nicht jede Millisekunde erhöht, sondern eben nur alle 5-8 Milliselkunden. Du kannst ja mal den Wert der Performancefreq. posten.
Außerdem sind 100 Durchläufe noch ziemlich wenig. Mache eine Schleife mit 3000 Durchläufen (~30 sek.) und stelle die Priorität der Anwendung auf Hoch ein - damit solltest du einigermaßen verlässliche Zeitangaben bekommen.
|
|
thepaine91 
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 28.04.09 13:56
Okay dann mach ich da mal neue messungen stell die auch nochmal bereit.
Und nicht milli sondern mikro
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 28.04.09 14:16
@jfheinz: Er misst mit QueryPerformanceCounter, dass schafft schon höhere Auflösungen. Wichtig ist dort aber eigentlich eher die Sache, welche Frequenz er dort angesagt bekommt. Weil einige CPUs liefern nur Werte von etwa 3MHz, während andere CPUs mit vollen 2GHz messen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
thepaine91 
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 28.04.09 14:51
So danke für alle Antworten bisher
Weiter gehts ^^
Anzahl der Schleifen durchläufe diesmal 100000
So das hat mein Program mir ausgespuckt:
Frequenz: 3579545
Werte in mirkosekunden:
Gesamtzeit der Schleifenmessungen: 585815,795024228
Wert den jfheins empfiehlt^^ : 5,85815795024228
Gesamtzeit der Schleife: 739261,833557058
Kleinster Wert: 5,58730229680029
Größter Wert: 1430,90811821055
So ich hab immer noch keine Aussagekräftige Antwort welcher Wert denn jetzt der ist den ich Verwenden soll
Vielen Dank für eure bemühungen
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 28.04.09 15:29
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
thepaine91 
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 28.04.09 15:36
 Stimmt.
Aber ^^ ist das für mich kein zuverlässiger Wert denn "verweis auf den größten Wert" verfälscht dieser das Ergebnis schon ziemlich und der Wert ist eigentlich unbrauchbar. ^^
Ich komme somit zum entschluss das die Zeitmessungen keinen Sinn ergeben und man keine Verwertbaren Resultate erzielt.
Und ich bezweifel das jemand das anders sieht denn letzendlich spielen da so viele Faktoren eine Rolle die das Ergebnis
verfälschen das man das just4fun machen kann. Aber aussagekräftige messungen dann doch eher nicht.
Vielleicht noch zur system eigenen Vergleichungen von prozessdauern denn da läuft es auf dem selben system und gibt immerhin einen Vergleichbaren Wert.
So denke ich darüber und somit ist das Thema eigentlich close würdig ^^ Meine Frage ist beantwortet.
EDIT:
So kann das ganze jetzt auch mit zahlen belegen und zwar an meinem Rechner: ca. 5.7 -5.8 mikrosekunden
an einem anderen 2.0-2.2 mikrosekunden
jeweils keine anwendungen offen und im taskmanager auf echtzeit gestellt soviel zu den Ergebnissen ^^
1000000 durchläufe und jeweils diese ca. 10 mal gemacht.
|
|
|