Zeit in Millisekunden in C

Lesezeit: 7 Minuten

Benutzeravatar von user980411
Benutzer980411

Unter Verwendung des folgenden Codes:

#include<stdio.h>
#include<time.h>
int main()
{
    clock_t start, stop;
    int i;
    start = clock();
    for(i=0; i<2000;i++)
    {
        printf("%d", (i*1)+(1^4));
    }
    printf("\n\n");
    stop = clock();

    //(double)(stop - start) / CLOCKS_PER_SEC

    printf("%6.3f", start);
    printf("\n\n%6.3f", stop);
    return 0;
}

Ich bekomme folgende Ausgabe:

56789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004

  2.169

  2.169
  1. Start- und Stoppzeiten sind gleich. Bedeutet dies, dass das Programm kaum Zeit benötigt, um die Ausführung abzuschließen?

  2. Wenn 1. falsch ist, dann sollte sich zumindest die Anzahl der Stellen hinter dem (.) unterscheiden, was hier nicht der Fall ist. Ist meine Logik richtig?

Notiz: Ich muss die Zeit berechnen, die für die Ausführung benötigt wird, und daher den obigen Code.

  • C11 ermöglicht eine Auflösung von bis zu Nanosekunden timespec_get: stackoverflow.com/a/36095407/895245

    – Ciro Santilli OurBigBook.com

    18. März 2016 um 22:57 Uhr

  • Es ist auch oder könnte betriebssystem- und computerspezifisch sein. Auf Linux lesen Zeit(7). Unter Windows, clock() wird gemunkelt, mangelhaft zu sein (Messung der Echtzeit, nicht der CPU-Zeit).

    – Basile Starynkevitch

    16. September 2017 um 10:51 Uhr


Benutzeravatar von cmh
cmh

Ja, dieses Programm hat wahrscheinlich weniger als eine Millisekunde gebraucht. Versuchen Sie es mit Mikrosekundenauflösung timeval.

z.B:

#include <sys/time.h>

struct timeval stop, start;
gettimeofday(&start, NULL);
//do stuff
gettimeofday(&stop, NULL);
printf("took %lu us\n", (stop.tv_sec - start.tv_sec) * 1000000 + stop.tv_usec - start.tv_usec); 

Sie können dann die Differenz (in Mikrosekunden) zwischen abfragen stop.tv_usec - start.tv_usec. Beachten Sie, dass dies nur für Subsekundenzeiten funktioniert (wie tv_usec wird Schleife). Verwenden Sie für den allgemeinen Fall eine Kombination aus tv_sec und tv_usec.

Bearbeiten 19.08.2016

Ein geeigneterer Ansatz für das System mit clock_gettime Unterstützung wäre:

struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC_RAW, &start);
//do stuff
clock_gettime(CLOCK_MONOTONIC_RAW, &end);

uint64_t delta_us = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_nsec - start.tv_nsec) / 1000;

  • Verwendung nicht vergessen struct timeval Anstatt von timeval; Ersteres wollte @cmh wahrscheinlich sagen, während letzteres einen Kompilierungsfehler verursacht.

    – fourisch

    19. Dezember 2013 um 1:20 Uhr

  • @InkBlend: Du hast natürlich Recht. Ich bin so daran gewöhnt, in C++ zu programmieren, wo die struct kann in solchen Fällen getrost weggelassen werden.

    – hm

    20. Dezember 2013 um 11:12 Uhr

  • tv_usec springt zu Beginn jeder Sekunde auf Null zurück. Der Ausdruck “stop.tv_usec – start.tv_usec” funktioniert nicht, weil man vorher nicht wissen kann, an welchem ​​Punkt innerhalb einer Sekunde jedes Sample erhalten wird. Sie müssen sowohl tv_sec als auch tv_usec verwenden, sogar für Sekundenbruchteile.

    – Adrian López

    11. Dezember 2014 um 23:11 Uhr


  • Beachten Sie, dass es bis zur Veröffentlichung von macOS Sierra 10.12 im September 2016 keine gab clock_gettime() auf Macs (Mac OS X 10.11 El Capitan und frühere Versionen hatten es nie). Bis Sierra, gettimeofday() war das Beste, was auf der Plattform verfügbar war, es sei denn, Sie gingen los und verwendeten spezialisierte Funktionen, die in den Mac-Frameworks (Objective C) usw. versteckt waren.

    – Jonathan Leffler

    19. Oktober 2016 um 1:36 Uhr

  • @Elliott es ist per se nicht falsch, es gibt überlegene Wege, um die gleichen Ziele zu erreichen etwas Systeme – aber es ist immer noch überall gültig clock_gettime ist nicht verfügbar.

    – hm

    16. September 2017 um 10:43 Uhr

Dieses Code-Snippet kann verwendet werden, um die Zeit in Sekunden, Millisekunden und Mikrosekunden anzuzeigen:

#include <sys/time.h>

struct timeval start, stop;
double secs = 0;

gettimeofday(&start, NULL);

// Do stuff  here

gettimeofday(&stop, NULL);
secs = (double)(stop.tv_usec - start.tv_usec) / 1000000 + (double)(stop.tv_sec - start.tv_sec);
printf("time taken %f\n",secs);

Benutzeravatar von unwind
entspannen

Einige Dinge können sich auf die angezeigten Ergebnisse auswirken:

  1. Du behandelst clock_t als Gleitkommatyp glaube ich nicht.
  2. Sie erwarten vielleicht (1^4), um etwas anderes zu tun, als bitweise zu berechnen XOR von 1 und 4., dh es ist 5.
  3. Da das XOR aus Konstanten besteht, ist es wahrscheinlich vom Compiler gefaltetwas bedeutet, dass es zur Laufzeit nicht viel Arbeit hinzufügt.
  4. Da die Ausgabe gepuffert wird (es wird nur die Zeichenfolge formatiert und in den Speicher geschrieben), ist sie tatsächlich sehr schnell abgeschlossen.

Sie geben nicht an, wie schnell Ihr Computer ist, aber es ist nicht unangemessen, dass dies auf moderner Hardware sehr schnell läuft, nein.

Wenn Sie es haben, versuchen Sie, einen Anruf hinzuzufügen sleep() zwischen den Start/Stop-Snapshots. Beachten Sie, dass sleep() ist jedoch POSIX, nicht Standard-C.

  • Bußgeld. Es ist nur eine Operation, die ich machen muss.

    – Benutzer980411

    17. April 2012 um 14:18 Uhr


  • Aber manchmal bekomme ich Werte wie 0,295 für Start und 0,497 für Stopp.

    – Benutzer980411

    17. April 2012 um 14:26 Uhr

Hier ist, was ich schreibe, um den Zeitstempel in Millionen Sekunden zu erhalten.

#include<sys/time.h>

long long timeInMilliseconds(void) {
    struct timeval tv;

    gettimeofday(&tv,NULL);
    return (((long long)tv.tv_sec)*1000)+(tv.tv_usec/1000);
}

Sie können verwenden gettimeofday() zusammen mit dem timedifference_msec() Funktion unten, um die Anzahl der zwischen zwei Samples verstrichenen Millisekunden zu berechnen:

#include <sys/time.h>
#include <stdio.h>

float timedifference_msec(struct timeval t0, struct timeval t1)
{
    return (t1.tv_sec - t0.tv_sec) * 1000.0f + (t1.tv_usec - t0.tv_usec) / 1000.0f;
}

int main(void)
{
   struct timeval t0;
   struct timeval t1;
   float elapsed;

   gettimeofday(&t0, 0);
   /* ... YOUR CODE HERE ... */
   gettimeofday(&t1, 0);

   elapsed = timedifference_msec(t0, t1);

   printf("Code executed in %f milliseconds.\n", elapsed);

   return 0;
}

Beachten Sie dies bei der Verwendung gettimeofday()müssen Sie Sekunden berücksichtigen, auch wenn Sie sich nur um Mikrosekundenunterschiede kümmern, weil tv_usec wird jede Sekunde auf Null zurückgesetzt, und Sie haben keine Möglichkeit, vorher zu wissen, an welchem ​​​​Punkt innerhalb einer Sekunde jeder Abtastwert erhalten wird.

  • Nur ein Hinweis: “POSIX.1-2008 markiert gettimeofday() als obsolet und empfiehlt stattdessen die Verwendung von clock_gettime(2).” – von “man gettimeofday()”

    – Roman Pietrzak

    4. September 2020 um 18:27 Uhr

Aus Mann Uhr:

Die Funktion clock() gibt eine Annäherung an die vom Programm verwendete Prozessorzeit zurück.

Es gibt also keinen Hinweis darauf, dass Sie es als Millisekunden behandeln sollten. Einige Standards erfordern einen genauen Wert von CLOCKS_PER_SECalso du könnte Verlassen Sie sich darauf, aber ich denke nicht, dass es ratsam ist. Zweitens ist es, wie @unwind feststellte, kein Float/Double. Mann mal schlägt vor, dass dies ein int sein wird. Beachten Sie auch Folgendes:

Diese Funktion gibt ungefähr alle 72 Minuten denselben Wert zurück

Und wenn Sie Pech haben, treffen Sie möglicherweise den Moment, in dem es gerade beginnt, von Null zu zählen, und erhalten so einen negativen oder großen Wert (je nachdem, ob Sie das Ergebnis als vorzeichenbehafteten oder vorzeichenlosen Wert speichern).

Dies:

printf("\n\n%6.3f", stop);

Wird höchstwahrscheinlich Müll drucken, da die Behandlung von int als Float wirklich kein definiertes Verhalten ist (und ich denke, hier kommt der größte Teil Ihres Problems). Wenn Sie sicherstellen möchten, dass Sie immer Folgendes tun können:

printf("\n\n%6.3f", (double) stop);

Obwohl ich es lieber drucken würde als long long int anfangs:

printf("\n\n%lldf", (long long int) stop);

  • Nur ein Hinweis: “POSIX.1-2008 markiert gettimeofday() als obsolet und empfiehlt stattdessen die Verwendung von clock_gettime(2).” – von “man gettimeofday()”

    – Roman Pietrzak

    4. September 2020 um 18:27 Uhr

Daniels Benutzeravatar
Daniel

Die Standard-C-Bibliothek bietet timespec_get. Es kann die Zeit mit einer Genauigkeit von Nanosekunden anzeigen, wenn das System dies unterstützt. Der Aufruf erfordert jedoch etwas mehr Aufwand, da es sich um eine Struktur handelt. Hier ist eine Funktion, die die Struktur einfach in eine einfache 64-Bit-Ganzzahl konvertiert, damit Sie die Zeit in Millisekunden erhalten.

#include <stdio.h>
#include <inttypes.h>
#include <time.h>

int64_t millis()
{
    struct timespec now;
    timespec_get(&now, TIME_UTC);
    return ((int64_t) now.tv_sec) * 1000 + ((int64_t) now.tv_nsec) / 1000000;
}

int main(void)
{
    printf("Unix timestamp with millisecond precision: %" PRId64 "\n", millis());
}

nicht wie clockgibt diese Funktion einen Unix-Zeitstempel zurück, damit sie die Zeit korrekt berücksichtigt, die zum Blockieren von Funktionen aufgewendet wird, wie z sleep.

  • $ cc -std=c11 temp.c temp.c:8:5: warning: implicit declaration of function 'timespec_get' is invalid in C99

    – Nakilon

    9. März 2021 um 8:57 Uhr

1414360cookie-checkZeit in Millisekunden in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy