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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.