2012-11-28 46 views
6

Ho bisogno di sapere come posso calcolare il tempo di una funzione in codice C in nanosecondi. Ho provato a ripetere la funzione fino a consumare alcuni microsecondi. Ci sono altre funzioni in time.h che possono essere utilizzate per calcolare il tempo in nanosecondi?Calcolo del tempo di funzionamento in nanosecondi nel codice C

+0

L'accuratezza del nanosecondo è, nella migliore delle ipotesi, altamente dipendente dalla piattaforma. Quale piattaforma - Windows/Linux/qualcosa di incorporato? –

+0

No, e misurare una singola chiamata di funzione non è comunque molto utile. Potresti usare clock() però. – Cubic

+1

Se si utilizza Linux, Linux non è una piattaforma in tempo reale. e la sua scala di pianificazione è in millisecondi. – MOHAMED

risposta

9

Non si otterrà mai la precisione al nanosecondo. Pensa a quello che stai chiedendo: su una CPU da 1 GHz 1 nanosecondo è un ciclo di clock. Indipendentemente da ciò che tenti di chiamare, non otterrai mai quel tipo di precisione, è meglio attenersi ai microsecondi. Una domanda simile con molti esempi è qui: C++ Cross-Platform High-Resolution Timer.

Solo per c: su Windows si desidera utilizzare QueryPerformanceCounter. Ed ecco altro su QPC. Here è una domanda correlata su come utilizzare QueryPerformanceCounter.

+0

timespec_get da C11 restituisce fino a nanosecondi, arrotondato alla risoluzione dell'implementazione. controlla http: // StackOverflow.it/a/36095783/2680660 – Efreeto

+0

@efreet Non ho detto che non è possibile ottenere un valore di ritorno di nanosecondo, ho detto che non sarebbe accurato e quindi non più utile di un valore di ritorno in millisecondi. – chacham15

1

A prescindere da come ci si avvicina a questo o da quale tipo di sistema/sistema operativo si sta utilizzando, si ottiene una risposta approssimativa al meglio, con una considerevole varianza dovuta alla natura del problema.

In secondo luogo, è necessario un sistema che supporti questo tipo di chiamata. È abbastanza facile se si sta utilizzando QNX Neutrino:

http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/c/clock_gettime.html

/* 
* This program calculates the time required to 
* execute the program specified as its first argument. 
* The time is printed in seconds, on standard out. 
*/ 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 

#define BILLION 1000000000L; 

int main(int argc, char** argv) 
    { 
    struct timespec start, stop; 
    double accum; 

    if(clock_gettime(CLOCK_REALTIME, &start) == -1) { 
     perror("clock gettime"); 
     return EXIT_FAILURE; 
    } 

    system(argv[1]); 

    if(clock_gettime(CLOCK_REALTIME, &stop) == -1) { 
     perror("clock gettime"); 
     return EXIT_FAILURE; 
    } 

    accum = (stop.tv_sec - start.tv_sec) 
      + (double)(stop.tv_nsec - start.tv_nsec) 
      /(double)BILLION; 
    printf("%lf\n", accum); 
    return EXIT_SUCCESS; 
    } 
0

La funzione clock in serie C non è utile per questo. Di solito ha una risoluzione orribile ed è incoerente (tra piattaforme) se misura il tempo di parete trascorso o il tempo di CPU consumato. È necessario utilizzare la funzione standard POSIX clock_gettime (che ha una risoluzione di nanosecondi e consente di specificare l'orologio da misurare) ed emularlo con qualsiasi operazione di clock specifica del sistema disponibile su piattaforme prive della funzione POSIX.

+0

nota: c'è una differenza tra "risoluzione del nanosecondo" e "accuratezza al nanosecondo". inoltre, vuole una soluzione Windows, che non è questa (scusa, l'ha menzionata in un commento, ho appena aggiunto il tag). – chacham15

0

Chiamare la funzione abbastanza volte per ottenere il tempo totale nei secondi e utilizzare qualsiasi metodo per misurare (anche semplice orologio C()). Misurare in micro/nanosecondi è intrinsecamente troppo impreciso.

Per il benchmarking, si desidera QueryPerformanceCounter. È il miglior cronometro disponibile su Windows. Vedi: How to use QueryPerformanceCounter? Tuttavia usando questo per misurare (per esempio) una singola chiamata di funzione sarà ancora intrinsecamente molto imprecisa; Penso che tu abbia bisogno di tempo sull'ordine di un secondo totale per ottenere un buon rapporto segnale-rumore per le tue misurazioni. Prendi più misure di qualunque durata tu voglia e confronta il loro valore con la loro deviazione standard per assicurarti di misurare con sufficiente accuratezza.

Multimedia Timers sono probabilmente il miglior orologio (notare la differenza tra orologio e cronometro: uno misura il tempo assoluto, solo gli altri intervalli di tempo) disponibile su Windows. Dovresti essere in grado di ottenere una risoluzione e precisione quasi al millisecondo con timeGetTime().

Problemi correlati