gcc: clock() liefert immer 0

Gast #2006015
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
Gast #2006038
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?
Gast #2006043
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.
#2006118
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.
#2006548
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
#2006600
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren