GNU/Linux >> Znalost Linux >  >> Linux

proč C clock() vrací 0

Správný způsob použití clock() k měření času by byl:

printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);

Je to proto, že u clock_t není zaručeno, že jde o int nebo jiný typ.


No, chcete čas something_else() bere? Zkuste toto:

#include <sys/time.h>
#include <stdio.h>  
#include <unistd.h>
int main(void) {
    struct timeval start, end;
    long mtime, secs, usecs;    

    gettimeofday(&start, NULL);
    something_else();
    gettimeofday(&end, NULL);
    secs  = end.tv_sec  - start.tv_sec;
    usecs = end.tv_usec - start.tv_usec;
    mtime = ((secs) * 1000 + usecs/1000.0) + 0.5;
    printf("Elapsed time: %ld millisecs\n", mtime);
    return 0;
}

Předpokládám, že důvodem je to, že vaše something_else() spotřebuje tak málo času, že přesahuje přesnost clock() . Zkusil jsem zavolat clock() dvakrát za sebou a oba start a end je nula, ale výsledek je rozumný, když mezi tím dělám nějaké časově náročné věci.

Zde je můj úryvek testovacího kódu:

int main(void) {   
    clock_t start, end;
    start = clock();
    int c;
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < (1<<30); j++) {
            c++;
        }
    }
    end = clock();
    printf("start = %d, end = %d\n", start, end);
    return 0;
}

A výsledek na mém počítači je:

start = 0, end = 27700000

Také dva tipy:

  1. Při testování nepoužívejte žádnou optimalizaci kompilátoru . Možná si myslíte, že vaše something_else() je časově náročné, ale kompilátor může tyto operace (zejména smyčky) ignorovat, protože je považuje za nesmyslné.
  2. Použijte sizeof(clock_t) na vaší platformě zobrazíte velikost clock_t .

clock funkce neměří taktovací cykly CPU.

C říká clock "vrací nejlepší aproximaci implementace na procesorový čas používaný programem od začátku implementace definované éry související pouze s vyvoláním programu."

Pokud mezi dvěma po sobě jdoucími clock volání, které naprogramujete, trvá méně než jedna jednotka z clock můžete získat 0 .

POSIX clock definuje jednotu s CLOCKS_PER_SEC jako 1000000 (jednotka je pak 1 mikrosekunda).

http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html

Chcete-li měřit hodinové cykly v x86/x64, můžete použít inline sestavu k načtení počtu hodin registru čítače CPU Time Stamp rdtsc .


Linux
  1. Hašování hesel a proč to potřebujeme

  2. Proč je Printf lepší než Echo?

  3. Proč není CD program?

  1. Df vs. Du:Proč tolik rozdílů??

  2. Proč potřebujeme mktemp?

  3. gpspipe vrací správné časové razítko, ale špatné datum (21. prosince 1995)

  1. Proč je Linux zásadní pro edge computing

  2. Proč server zablokoval moji IP?

  3. Proč je můj rsync tak pomalý?