Il calcolo della Funzione di tempo in nanosecondi in codice C

Ho bisogno di sapere come posso calcolare il tempo di una funzione in C codice in nanosecondi.
Ho provato a ripetere la funzione fino a consumare alcuni microsecondi. Ci sono altre funzioni time.h che può essere utilizzato per calcolare il tempo in nanosecondi?

Precisione al nanosecondo è altamente dipendente dalla piattaforma. Quello che per piattaforma Windows/Linux/qualcosa incorporato?
No, e la misura di una singola chiamata di funzione non è molto utile, comunque. Si potrebbe utilizzare clock() però.
Se si utilizza linux, Linux non è in tempo reale piattaforma. e la pianificazione di scala è espresso in millisecondi.
Provare a fare un profiling il programma per ottenere un tempo relativo di ciascuna funzione.
C11 diventa disponibile timespec_get farà: stackoverflow.com/a/36095407/895245 linux versione di questa domanda: stackoverflow.com/questions/16275444/…

OriginaleL’autore Mousa Farajallah | 2012-11-28

4 Replies
  1. 9

    Non si è mai intenzione di ottenere nanosecondo precisione. Pensate a quello che si stanno chiedendo: su una CPU da 1 GHz 1 nanosecondo è un ciclo di clock. Non importa ciò che si tenta di chiamare, non si sarà mai ottenere che tipo di precisione, è meglio attaccare a microsecondi. Una domanda simile, con molti esempi qui di seguito: C++ Cross-Platform Timer Ad Alta Risoluzione.

    Per il solo c: di windows che si desidera utilizzare il QueryPerformanceCounter. E qui è più QPC. Qui è una questione collegata su come utilizzare QueryPerformanceCounter.

    timespec_get da C11 restituisce fino a nanosecondi, arrotondati per la risoluzione di attuazione. check out stackoverflow.com/a/36095783/2680660
    Io non dico che si poteva ottenere un nanosecondo valore di ritorno, ho detto che wouldnt essere precisi e quindi non più utile di un millisecondo valore di ritorno.

    OriginaleL’autore chacham15

  2. 1

    Indipendentemente da come ci si avvicina a questa o che tipo di sistema/operativo che si sta utilizzando, si sono sempre approssimativo di rispondere al meglio, con una notevole varianza a causa della natura del problema.

    In secondo luogo, è necessario disporre di un sistema che supporta questo tipo di chiamata. È abbastanza facile se si utilizza 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;
      }

    OriginaleL’autore DevNull

  3. 0

    Il clock funzione in C standard non è utile per questo. Di solito è orribile risoluzione ed è incoerente (tra le piattaforme) che si tratti di misure trascorso il tempo di parete o di tempo di cpu consumata. Si dovrebbe usare il POSIX standard clock_gettime funzione (che ha nanosecondo risoluzione e consente di specificare che si desidera misurare contro) e installarlo con qualunque sistema specifiche per orologio operazioni sono disponibili su piattaforme che non hanno la funzione POSIX.

    nota: c’è una differenza tra “nanosecondo risoluzione” e “nanosecondo precisione”. inoltre, si vuole una soluzione windows, che questo non è (scusa, ha detto in un commento, ho solo aggiunto il tag).

    OriginaleL’autore R..

  4. 0

    Chiamare la funzione di un sufficiente numero di volte che si ottiene il tempo totale in secondi, e utilizzare qualsiasi metodo per misurare (anche normale C clock()). Misura in micro/nanosecondi è di per sé troppo imprecisa.

    Per il benchmarking, vuoi QueryPerformanceCounter. È il miglior cronometro disponibile su Windows. Vedere: Come utilizzare QueryPerformanceCounter? Tuttavia l’uso di questo per misurare (per esempio) una singola chiamata di funzione sarà ancora intrinsecamente molto imprecise; credo che hai bisogno di tempo dell’ordine di un secondo totale per ottenere un buon segnale-rumore per le vostre misure. Prendere misure multiple di qualunque durata che si desidera e confrontare il loro valore per la loro deviazione standard per assicurarsi che si misura sufficientemente precisa.

    Timer Multimediali sono probabilmente il miglior orologio (si noti la differenza tra l’orologio e cronometro: una misura di tempo assoluto, gli altri intervalli di tempo solo) disponibile su Windows. Si dovrebbe essere in grado di ottenere vicino millisecondi risoluzione e la precisione con timeGetTime().

    OriginaleL’autore Alex I

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *