Wie kann man den Zeitunterschied in der Genauigkeit von Millisekunden und Nanosekunden von C in Linux drucken?

Lesezeit: 4 Minuten

Benutzer-Avatar
RajSanpui

Ich habe dieses Programm, das den Zeitunterschied zwischen 2 verschiedenen Instanzen druckt, aber es druckt in Sekundengenauigkeit. Ich möchte es in Millisekunden und ein anderes in Nanosekunden Unterschied drucken.

//Prints in accuracy of seconds

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

int main(void)
{
    time_t now, later;
    double seconds;

    time(&now);
    sleep(2);

    time(&later);
    seconds = difftime(later, now);

    printf("%.f seconds difference", seconds);
}

Wie kann ich das erreichen?

  • Auf welcher Plattform bist du?

    – zwischenjay

    29. April 2013 um 9:40 Uhr

  • das könnte helfen: stackoverflow.com/questions/13610471/…

    – Ismet Alkan

    29. April 2013 um 9:40 Uhr

  • @interjay: Tut mir leid, ich hätte das erwähnen sollen, es ist Linux. gcc-Compiler.

    – RajSanpui

    29. April 2013 um 9:42 Uhr

  • Sie können keine Nanosekunden-Präzision haben. stackoverflow.com/questions/13610471/…

    – Lucasg

    29. April 2013 um 9:42 Uhr

  • @georgesl du kann Holen Sie sich Zeit auf Nanosekunden-Präzision unter Linux. Es ist jedoch nicht garantiert, dass dies auf Nanosekunden genau ist, da ich glaube, dass es sich bei den meisten Architekturen um eine Interpolation zwischen zwei Mikrosekundenwerten handeln kann, die auf der internen Uhr der CPU basieren. Sie können immer verwenden clock_getres doch zu finden.

    – Werden

    29. April 2013 um 10:30 Uhr

Benutzer-Avatar
Basile Starynkevitch

Lesen Sie zuerst die Zeit(7) Manpage.

Dann können Sie verwenden clock_gettime(2) syscall (Möglicherweise müssen Sie verlinken -lrt es bekommen).

Du könntest es also versuchen

    struct timespec tstart={0,0}, tend={0,0};
    clock_gettime(CLOCK_MONOTONIC, &tstart);
    some_long_computation();
    clock_gettime(CLOCK_MONOTONIC, &tend);
    printf("some_long_computation took about %.5f seconds\n",
           ((double)tend.tv_sec + 1.0e-9*tend.tv_nsec) - 
           ((double)tstart.tv_sec + 1.0e-9*tstart.tv_nsec));

Erwarten Sie nicht, dass die Hardware-Timer eine Nanosekunden-Genauigkeit haben, selbst wenn sie eine Nanosekunden-Auflösung liefern. Und versuchen Sie nicht, Zeitdauern von weniger als einigen Millisekunden zu messen: Die Hardware ist nicht treu genug. Sie können auch verwenden clock_getres um die Auflösung einer Uhr abzufragen.

  • das ist wahr, es funktioniert für mich. vielen Dank @Basile

    – EsmaeelE

    6. August 2017 um 0:20 Uhr


  • Dass die Hardware nicht „treu genug“ sei, Sub-ms-Intervalle zu messen, ist eine zweifelhafte Behauptung. Wenn dies zutrifft, wäre angesichts der Genauigkeit von Quarzoszillatoren eine Erklärung erforderlich.

    – gsimard

    21. Oktober 2018 um 1:45 Uhr

  • Ich bin mir nicht sicher, ob die typische Uhr auf einem typischen Consumer-PC eine relative Genauigkeit von 1e-10 hat. Die meisten Uhren sind nicht so genau. Diejenigen, die kosten wahrscheinlich mehr als ein Auto. Ich kann nicht einmal den Anbieter solch hochpräziser Uhren nennen.

    – Basile Starynkevitch

    21. Oktober 2018 um 5:52 Uhr

  • Für rechnerisches Benchmarking ist es besser, CLOCK_PROCESS_CPUTIME_ID anstelle von CLOCK_MONOTONIC zu verwenden

    – Lothar

    3. März 2021 um 8:45 Uhr

  • Ich würde die Berechnung neu anordnen, um Rundungsfehler zu minimieren: (double) (tend.tv_sec - tstart.tv_sec) + 1.0e-9 * (double) (tend.tv_nsec - tstart.tv_nsec)

    – HAL9000

    5. Oktober 2021 um 21:42 Uhr

Benutzer-Avatar
Ciro Santilli OurBigBook.com

timespec_get ab C11

Diese Funktion gibt bis zu Nanosekunden zurück, gerundet auf die Auflösung der Implementierung.

Beispiel aus: http://en.cppreference.com/w/c/chrono/timespec_get :

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

int main(void)
{
    struct timespec ts;
    timespec_get(&ts, TIME_UTC);
    char buff[100];
    strftime(buff, sizeof buff, "%D %T", gmtime(&ts.tv_sec));
    printf("Current time: %s.%09ld UTC\n", buff, ts.tv_nsec);
}

Ausgabe:

Current time: 02/18/15 14:34:03.048508855 UTC

Weitere Details hier: https://stackoverflow.com/a/36095407/895245

  • Das ist toll. Gibt es eine einfache Möglichkeit, buff und ts.tv_sec zu einer einzigen Zeichenfolge zu verketten? Ich habe versucht, .append() in cpp ohne Erfolg zu verwenden.

    – viel Glück

    16. Dezember 2020 um 18:48 Uhr

  • @p.luck nicht sicher, ob ich die Frage verstehe. Meinst du verketten ts.tv_sec und ts.nsec in einer einzigen Saite? Dafür etwas mit strftime %D %T %s + eine Sekunde snprintf Aufruf: stackoverflow.com/questions/3774417/…

    – Ciro Santilli OurBigBook.com

    16. Dezember 2020 um 21:45 Uhr


Benutzer-Avatar
yairgd

Hier ist ein einfaches Makro, um damit umzugehen

#include <time.h>
#define CHECK_TIME(x) {\
    struct timespec start,end;\
    clock_gettime(CLOCK_REALTIME, &start);\
    x;\
    clock_gettime(CLOCK_REALTIME, &end);\
    double f = ((double)end.tv_sec*1e9 + end.tv_nsec) - ((double)start.tv_sec*1e9 + start.tv_nsec); \
    printf("time %f ms\n",f/1000000); \
    }

und hier ist, wie man es benutzt:

CHECK_TIME(foo(a,b,c))

1386130cookie-checkWie kann man den Zeitunterschied in der Genauigkeit von Millisekunden und Nanosekunden von C in Linux drucken?

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

Privacy policy