Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitmessung mit dem PI (in C)
DanielSan
20.01.2013, 14:21
Hi,
ich versuche mich gerade daran ein kleines Programm zu schreiben, mit dem ich testen kann wie lang es z.B. dauert bis 100 zu zählen. Aber irgendwie gelingt mir das nicht. Das eigentliche Ziel ist, später Messungen durchzuführen, deren Zeitinterval möglichst gleich ist. Also z.B. 100 Messungen/s möglichst gleichmäßig auf eine Sekunde verteilt durchzuführen.
Hier mal was ich bis jetzt habe:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main()
{
double a,b,c;
a = clock();
printf("%d\n",a);
printf("%d\n",a);
b = clock();
c = b-a;
printf("%f - %f = %f\n",b,a,c);
return(0);
}
Die Ausgabe sieht dann so aus:
100
1
0.000000 - 0.000000 = 0.000000
Was mich z.B. sehr wundert, ist das wenn ich "a" zweimal ausgebe, der Wert ein anderer ist. Obwohl ich die Variable ja eigentlich garnicht mehr angefasst habe.
Habt ihr einen Tip für mich?
Danke
Gruß Daniel
Hey,
in wie weit unterscheiden sich die Variablen den dann?
DanielSan
20.01.2013, 14:37
So wie ich das verstanden habe, sollte clock() ja die aktuelle Zeit zurückgeben. Also sollten sich "a" und "b" ja geringfügig unterscheiden. Die Differenz daraus wäre dann mein Zeitunterschied. Das klappt aber nicht.
oberallgeier
20.01.2013, 14:54
... sollte clock() ja die aktuelle Zeit ... sollten sich "a" und "b" ja geringfügig ...
a) So wie ich das verstehe, clockt das Pi recht flott.
b) In welcher Feinheit wird "clock()" gemessen? Hunderstel, tausendstel, millionstel Sekunden??
...
main()
{
...
a = clock();
printf("%d\n",a);
printf("%d\n",a);
b = clock();
...
}Wenn ich annehme, dass die clock in tausendstel Sekunden gemessen wird (ein durchaus brauchbarer Wert) kann ich mir vorstellen, dass das Pi sich bei der Aufgabe so langweilt, dass da garnix clockt . . .
Hey,
schau mal vielleicht hilft dir das ja weiter:
http://www.cplusplus.com/reference/ctime/clock/
So wie ich das verstehe gibt Clock nur die Ausführungszeit des Programms aus.
DanielSan
20.01.2013, 15:37
@Kampi: Ja so hab ichs auch verstanden. Sollte aber doch trotzdem funktionieren!?
@Oberallgeier: Habe meinen Code mal etwas geändert:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main()
{
int i;
double a,b,c;
a = clock();
for (i=0;i<5000;i++){
printf("%f\n", a);
}
b = clock();
c = b-a;
printf("%f - %f = %f\n",b,a,c);
return(0);
}
Die Ausgabe sieht dann so aus:
...
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
380000.000000 - 0.000000 = 380000.000000
Sind das dann 380000 Mikrosekunden? Das wären ja 380 Millisekunden bzw. 0,38 Sekunden. Gefühlt könnte das schon hinkommen. Aber die Genauigkeit wäre ja dann "nur" 0,01 Sekunden also hundertstel Sekunden. Das ist mir zu ungenau, besonders wenn man die Leistung des Pi´s bedenkt. Da muss doch noch mehr gehen!?
Danke
Gruß Daniel
- - - Aktualisiert - - -
Ok hab nochmal ein bisschen rumgespielt.
Code:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
main()
{
struct timeval tim;
int i;
double t1,t2,c;
gettimeofday(&tim, NULL);
t1=tim.tv_sec+(tim.tv_usec/1000000.0);
for (i=0;i<5000;i++){
printf("test\n");
}
gettimeofday(&tim,NULL);
t2=tim.tv_sec+(tim.tv_usec/1000000.0);
c = t2-t1;
printf("%.6lf - %.6lf = %.6lf\n",t2,t1,c);
return(0);
}
Die Ausgabe:
...
test
test
test
test
test
1358692383.953361 - 1358692383.271900 = 0.681461
Das ist ja schonmal deutlich genauer. 4999 mal "test" zu schreiben, dauert also ca. 0.6 Sekunden. Ich hab den Code jetzt mehrmals ausgeführt. Es gibt eine Abweichung von +-0.1 Sekunden. Liegt das daran, das es nicht Echtzeitmäßig läuft? Oder weil mein Pi auch noch was anderes macht? Prozessorlast ist auf maximal 0.1%.
Ist eine "genaue" Zeitmessung mit dem Pi also Systembedingt garnicht möglich?
Gruß
Danke Daniel
AlexAtRobo
22.01.2013, 16:33
Ja, ich vermute mal ohne Echtzeittauglichem Betriebssystem wirst du immer dieses Problem haben, da dein Prozess keine garantierte Zykluszeit bekommt. Ist also nur bedingt für exakte Aufgaben geeignet. Liegt wie gesagt aber nicht am Pi selbst, sondern an der Betriebssystemarchitektur - das Problem hast mit PCs ebenso.
schorsch_76
22.01.2013, 19:28
Auch für den Arm gibts den RTAI (https://www.rtai.org) Kernel Patch und RT_PREMPT (https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO).
Gurß
Georg
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.