getsystemtimeasfiletime - windows system time vs local time




Berechnung der Funktionszeit in Nanosekunden in C-Code (3)

Die clock in Standard C ist hierfür nicht sinnvoll. Es hat normalerweise eine schreckliche Auflösung und es ist inkonsistent (zwischen Plattformen), ob es die verstrichene Wandzeit oder die verbrauchte CPU-Zeit misst. Sie sollten die POSIX-Standardfunktion clock_gettime (die eine Auflösung von einer Nanosekunde hat und Sie clock_gettime können, welche Uhr Sie messen möchten) und mit den clock_gettime auf Plattformen ohne POSIX-Funktion emulieren.

Ich muss wissen, wie ich die Zeit einer Funktion in C-Code in Nanosekunden berechnen kann. Ich habe versucht, die Funktion zu wiederholen, bis einige Mikrosekunden verbraucht sind. Gibt es noch andere Funktionen in time.h , mit denen sich die Zeit in Nanosekunden berechnen lässt?


Unabhängig davon, wie Sie sich dieser oder welcher Art von System / Betriebssystem nähern, erhalten Sie bestenfalls eine ungefähre Antwort mit beträchtlichen Abweichungen aufgrund der Art des Problems.

Zweitens benötigen Sie ein System, das diese Art von Anruf unterstützt. Es ist ziemlich einfach, wenn Sie QNX Neutrino verwenden:

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;
  }

Sie werden niemals eine Genauigkeit im Nanosekundenbereich erreichen. Denken Sie darüber nach, was Sie fragen: Auf einer 1-GHz-CPU ist 1 Nanosekunde ein Taktzyklus. Egal, was Sie versuchen zu rufen, Sie werden nie diese Art von Genauigkeit erhalten, Sie sollten lieber in Mikrosekunden bleiben. Eine ähnliche Frage mit vielen Beispielen finden Sie hier: C ++ Cross-Platform High-Resolution Timer .

Nur für c: Unter Windows möchten Sie den QueryPerformanceCounter verwenden . Und hier ist mehr auf QPC . Hier ist eine verwandte Frage zur Verwendung von QueryPerformanceCounter.





time