Forum: Compiler & IDEs gcc: clock() liefert immer 0


von Robert (Gast)


Lesenswert?

Hallo an alle,

Um die Zeit zu messen die ein Algorithmus (geschrieben in C) unter gcc 
benötigt wollte ich die Funktion clock() nutzen.

Jeder Aufruf von clock() liefert jedoch 0 zurück. Woran kann das liegen?

Folgendes Minimalbeispiel liefert 0.00 als Laufzeit:
1
#include <stdio.h>
2
#include <time.h>
3
 
4
int count;
5
 
6
int main(void)
7
{
8
  clock_t start, stop; 
9
  start = clock(); 
10
 
11
  for(count = 0; count < 1000000; count++);
12
13
  stop = clock();
14
  printf("Runtime %.2f sec\n", (float)(stop - start) / CLOCKS_PER_SEC);
15
  getchar();
16
  return 0;
17
}

Ich hoffe ihr könnt mir helfen.

Danke im Voraus
Robert

: Verschoben durch User
von Peter (Gast)


Lesenswert?

das wird schon alles stimmen.

Denn das
>  for(count = 0; count < 1000000; count++);
wird er compiler komplett weglassen, weil es nichts sinnvolles macht.

von g457 (Gast)


Lesenswert?

..mach mal noch irgendwas(tm) sinnvolles(tm) in der Schleife - bis 1e6 
zählen (so es nicht sowieso wegoptimiert wird) ist für einen heutigen 
Prozessor nun wirklich keine Herausforderung.

von Robert (Gast)


Lesenswert?

Gut, gebe ich in jedem Iterationschritt etwas mit printf() aus geht es.

Meine Frage: Warum liefert clock() immer 0 zurück? Auch wenn die 
Schleife wegoptimiert wird, müssten doch Ticks zwischen den beiden 
Funktionsaufrufen vergehen, oder?

von Peter (Gast)


Lesenswert?

Robert schrieb:
> Warum liefert clock() immer 0 zurück? Auch wenn die
> Schleife wegoptimiert wird, müssten doch Ticks zwischen den beiden
> Funktionsaufrufen vergehen, oder?
dafür müsste man erstmal wissen auf welchen wert CLOCKS_PER_SEC steht, 
wenn es z.b. nur auf 10 steht, dann kannst du nur bis 10ms auflösen und 
in der Zeit kein eine CPU verdammt viel machen. Selbst wenn es ms sind 
wird es nicht reichen. Die CPU wird nur ein paar µs dafür brauchen.

von Klaus W. (mfgkw)


Lesenswert?

Robert schrieb:
> Meine Frage: Warum liefert clock() immer 0 zurück? Auch wenn die
> Schleife wegoptimiert wird, müssten doch Ticks zwischen den beiden
> Funktionsaufrufen vergehen, oder?

nein.
Die Auflösung ist ja nicht beliebig fein.
Wenn weniger Zeit vergeht als 1 sec/CLOCKS_PER_SEC, steht
der Zeitzähler noch auf dem alten Wert 0.

von Klaus W. (mfgkw)


Lesenswert?

Peter schrieb:
> wenn es z.b. nur auf 10 steht, dann kannst du nur bis 10ms...

100 ms in diesem Beispiel.

von Peter (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> 100 ms in diesem Beispiel.Beitrag melden | Bearbeiten | Löschen |
genau das meinte ich.

Robert schrieb:
> Warum liefert clock() immer 0 zurück?
du weist doch gar nicht was clock zurückliefert, du gibst es überhaupt 
nicht aus. Deine berechnung liefert 0 aber clock kann was anderes 
liefern.

von D. I. (Gast)


Lesenswert?

nimm nicht clock() sondern gettimeofday() und timersub()

von Klaus W. (mfgkw)


Lesenswert?

Das kommt darauf an, was man eigentlich messen will.
Kalender-/Uhrzeit: gettimeofday
verbrauchte Rechenzeit: clock

Je nach Anzahl Kerne, CPU-Auslastung etc. können da ganz 
unterschiedliche Werte rauskommen.

PS:
Bzw. bei einem Thread ist die Anzahl Kerne natürlich nicht direkt
relevant, außer daß eine Auslastung durch andere Prozesse nicht gleich 
auf die Messung durchschlägt.

von Robert (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Die Auflösung ist ja nicht beliebig fein.
> Wenn weniger Zeit vergeht als 1 sec/CLOCKS_PER_SEC, steht
> der Zeitzähler noch auf dem alten Wert 0.

Danke für die Erklärung.

Gibt es eine Möglichkeit um auch kleine Zeiten zu messen?

von Klaus W. (mfgkw)


Lesenswert?

Nicht im Standard.

PS:
Ein portabler Weg ist, das zu messende Programmstück
entsprechend oft laufen zu lassen, bis man etwas vernünftiges
misst, und dann die gemessenen Zeit durch die Anzahl zu teilen.

von Rolf M. (rmagnus)


Lesenswert?

Robert schrieb:
> Klaus Wachtler schrieb:
>> Die Auflösung ist ja nicht beliebig fein.
>> Wenn weniger Zeit vergeht als 1 sec/CLOCKS_PER_SEC, steht
>> der Zeitzähler noch auf dem alten Wert 0.
>
> Danke für die Erklärung.
>
> Gibt es eine Möglichkeit um auch kleine Zeiten zu messen?

Je nach Zielprozessor gibt es möglicherweise einen Zähler, der mit 
Prozessortakt läuft.
Für x86 siehe http://en.wikipedia.org/wiki/Time_Stamp_Counter

von (prx) A. K. (prx)


Lesenswert?


von Klaus W. (mfgkw)


Lesenswert?

Falls gcc: da habe ich mal folgende Funktion gebastelt (wird
als eigener Quelltext assembliert und dann zu einem C-Programm
dazu gelinkt):
1
#  Time-stamp:  "19.03.04 19:05 getCPUClockCount.s klaus@wachtler.de"
2
#
3
# Assemblerfunktion für gcc auf i386
4
#   unsigned long long getCPUClockCount();
5
# 
6
# 
7
# 
8
9
        .file  "getCPUClockCount.s"
10
        .text
11
12
.globl getCPUClockCount
13
  .type  getCPUClockCount, @function
14
15
# rdtsc liefert in edx:eax einen 64-Bit-Zähler
16
# der bisherigen CPU-Takte zurück.
17
# Das paßt gerade, weil eine long long-Funktion
18
# ihr Ergebnis in edx (höherwertige 4 Byte) und eax
19
# (untere 4 Byte) liefern muß.
20
21
getCPUClockCount:
22
23
# kein Sichern des SP bzw. Anlegen eines Stackframe nötig, weil
24
# von hier aus nichts mehr aufgerufen wird:
25
#  pushl  %ebp
26
#  movl  %esp, %ebp
27
28
        rdtsc
29
30
# Kein Zurückladen eines Framepointers nötig:
31
#  popl  %ebp
32
  ret
33
34
  .size  getCPUClockCount, .-getCPUClockCount

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.