Autor Beitrag
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 08.04.2009 um 19:11
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mi 08.04.09 13:21 
Dankeschön vil hab ich mich unglücklich angestellt beim Suchen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mi 08.04.09 23:10 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mi 08.04.09 23:36 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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. :P

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 28.04.09 13:52 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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 :D
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 :P

Vielen Dank für eure bemühungen
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 28.04.09 15:29 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Frequenz: 3579545

Intel-CPU nehm ich mal an :P

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
So ich hab immer noch keine Aussagekräftige Antwort welcher Wert denn jetzt der ist den ich Verwenden soll :P

Doch ^^
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Wert den jfheins empfiehlt^^ : 5,85815795024228 :D


:P

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Di 28.04.09 15:36 
:P 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.