Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zeitmessung mit C/C++

5 views
Skip to first unread message

MHilt2k

unread,
Aug 27, 2000, 3:00:00 AM8/27/00
to
Hallo,

ich moechte gerne die Zeit zwischen 2 Ereignissen in meinem Programm
bestimmen (in Millisekunden genau).
Am besten waere es, wenn ich die einzelnen Zeitpunkt in verschiedenen
Variablen abspeichern koennte, um am Ende des Programm die Zeit-
Differenzen auszugeben.

Kann mir jemand sagen, wie dies moeglich ist (am besten mit dem entspr.
Source-Code) ??

Danke fuer die Muehe
Gruss
Markus


Johannes Hampel

unread,
Aug 27, 2000, 3:00:00 AM8/27/00
to


Hi, geht vielleicht auch einfacher, aber ich hab das bei einigen
Testprogrammen so erledigt:

-----------------------------------------------------------------------
#define START_MEASURE_TIME \
timeval starttime; \
timeval endtime; \
if (gettimeofday(&starttime, NULL)!=0) \
{ \
printf("*** Error in gettimeofday: %s\n", strerror(errno)); \
exit (EXIT_FAILURE); \
}

#define END_MEASURE_TIME \
if (gettimeofday(&endtime, NULL)!=0) \
{ \
printf("*** Error in gettimeofday: %s\n", strerror(errno)); \
exit (EXIT_FAILURE); \
} \
endtime.tv_sec -= starttime.tv_sec; \
endtime.tv_usec -= starttime.tv_usec; \
if (endtime.tv_usec<0) \
{ \
endtime.tv_sec--; \
endtime.tv_usec += 1000000; \
}
printf("function call takes %ld ms\n",
endtime.tv_sec*1000+endtime.tv_usec/1000);

void f()
{
START_MEASURE_TIME;

/* Zu Messender Source hier */

END_MEASURE_TIME;
}
-----------------------------------------------------------------------


Gruss,

Johannes
--
---------------------------------------------------
Johannes Hampel Linux User #154773
eMail: joha...@gmx.net ( counter.li.org )
---------------------------------------------------

Helmut Schellong

unread,
Aug 27, 2000, 3:00:00 AM8/27/00
to
MHilt2k wrote:
>
> Hallo,
>
> ich moechte gerne die Zeit zwischen 2 Ereignissen in meinem Programm
> bestimmen (in Millisekunden genau).

In ms genau geht praktisch nirgendwo!,
denn die Auflösung ist eigentlich nie besser als
10ms-Schritte.
Funktionen, die us nehmen, arbeiten dann in Sprüngen
von 10000 Einheiten.

--
Mit freundlichen Grüßen
Helmut Schellong po...@schellong.de po...@schellong.com
http://www.schellong.de http://www.schellong.com
http://home.t-online.de/home/schellong sche...@t-online.de

Kremser Herbert

unread,
Aug 27, 2000, 3:00:00 AM8/27/00
to
Helmut Schellong <sche...@t-online.de> wrote:
>> ich moechte gerne die Zeit zwischen 2 Ereignissen in meinem Programm
>> bestimmen (in Millisekunden genau).

> In ms genau geht praktisch nirgendwo!

Falls du Helmut Schellong noch nicht kennst, er meint fast nie
woertlich was er sagt. Wenn er hier schreibt "praktisch nirgendwo"
dann meint er es geht mit Windows nicht.

In C geht das aber tatsaechlich nicht portabel, und auf vielen Systemen
gehts auch wirklich nicht. Das heisst aber natuerlich nicht dass es
nicht genug Systeme gaebe, die so genau messen koennen, und auch mit
C programmiert werden.

Wende dich also am besten an eine BS-Gruppe deiner Wahl, ob es geht.

Herbert

Uwe Hercksen

unread,
Aug 28, 2000, 3:00:00 AM8/28/00
to
On Sun, 27 Aug 2000 17:04:30 +0200, Helmut Schellong
<sche...@t-online.de> wrote:

>In ms genau geht praktisch nirgendwo!,
>denn die Auflösung ist eigentlich nie besser als
>10ms-Schritte.
>Funktionen, die us nehmen, arbeiten dann in Sprüngen
>von 10000 Einheiten.

Hallo,

natürlich ist das sehr systemspezifisch, aber unter Windows 9x und NT
gibt es die API Funktion QueryPerformanceCounter, mit der ist die
Auflösung erheblich besser als 1 ms, genauer 0,83 µs ;-)
Dazu muss man aber mit 64 bit Integern rechnen.

Bei der Verbreitung von 32 bit Windows ist das schon deutlich häufiger
als "praktisch nirgendwo" möglich. ;-)

Eine Auflösung von 0,83 µs bedeutet aber nicht gleich auch eine
Genauigkeit von ms, der Quarz von dem der Takt abgeleitet wird ist
nicht so präzise das man Zeiten von einigen 10 Sekunden auf 1 ms genau
messen könnte. Ausserdem kann ja auch die Bearbeitung von
Systeminterrupts die Zeitmessung im Anwenderprogramm stören.

Bye
--
Uwe Hercksen
Elektronikwerkstatt Universität Erlangen-Nürnberg
Cauerstr. 5 D91058 Erlangen

Helmut Schellong

unread,
Aug 28, 2000, 3:00:00 AM8/28/00
to
Uwe Hercksen wrote:
>
> On Sun, 27 Aug 2000 17:04:30 +0200, Helmut Schellong
> <sche...@t-online.de> wrote:
>
> >In ms genau geht praktisch nirgendwo!,
> >denn die Auflösung ist eigentlich nie besser als
> >10ms-Schritte.
> >Funktionen, die us nehmen, arbeiten dann in Sprüngen
> >von 10000 Einheiten.
>
>
> natürlich ist das sehr systemspezifisch, aber unter Windows 9x und NT
> gibt es die API Funktion QueryPerformanceCounter, mit der ist die
> Auflösung erheblich besser als 1 ms, genauer 0,83 µs ;-)
> Dazu muss man aber mit 64 bit Integern rechnen.
>
> Bei der Verbreitung von 32 bit Windows ist das schon deutlich häufiger
> als "praktisch nirgendwo" möglich. ;-)
>
> Eine Auflösung von 0,83 µs bedeutet aber nicht gleich auch eine
> Genauigkeit von ms, der Quarz von dem der Takt abgeleitet wird ist
> nicht so präzise das man Zeiten von einigen 10 Sekunden auf 1 ms genau
> messen könnte. Ausserdem kann ja auch die Bearbeitung von
> Systeminterrupts die Zeitmessung im Anwenderprogramm stören.

Ja, das ist der Punkt.
Diejenigen Funktionen mit grober Auflösung halten die
Prozesse auseinander.
HZ=100 gibt Gelegenheit dafür.
Und die tatsächliche, individuelle Auflösung muß man sich erst
per QueryPerformanceFrequency besorgen, sofern
vom System unterstützt.

Es wäre aber nicht schlecht, wenn die Prozessoren
einen 64Bit-Counter drin hätten, den man beispw.
mit Instruktion getcnt holen könnte, die dann die
Register edx:eax füllt...

0 new messages