Genaue Timestamps



  • Hallo,

    spiele immer noch etwas mit C herum und bastle gerade an einem mehr oder weniger aussagekräftigem HDD-Test:

    #include <stdio.h>
    #include <time.h>
    
    void file_write(int size, char *path) {
        int i;
        char buffer[1024];
        for (i=0; i<1024; i++) {
            buffer[i] = '0';
        }
        size /= 1024;
        FILE *file = fopen(path, "w");
        for (i=0; i<size; i++) {
            fputs(buffer, file);
        }
        fclose(file);
    }
    
    int main() {
        int size = 500 * 1024 * 1024;
        time_t start, end;
        double diff;
        double data_rate;
        time(&start);
        file_write(size, "ttt");
        time(&end);
        diff = difftime(end, start);
        data_rate = size / (1024 *1024) / diff;
        printf("Sekunden: %.2f\n", diff);
        printf("Datenrate: %.2fMB/s\n", data_rate);
        return 0;
    }
    

    Nun bekomme ich für die Zeit anscheinend immer ganze Sekunden, würde aber gerne genauere Werte bekommen. Wie erreiche ich das mit C? Habe leider in der Doku von time.h nichts gefunden.

    Danke!



  • clock statt time löst ein wenig feiner auf.



  • So in etwa:

    float start, end;
    start = (float) clock ();
    end = (float) clock ();
    printf ("%.3f", (end - start) / CLOCKS_PER_SEC);
    


  • volkard schrieb:

    clock statt time löst ein wenig feiner auf.

    oder 'gettimeofday()', aber ich glaub die funktion gibts nicht überall.
    🙂



  • monstermunchkin schrieb:

    / CLOCKS_PER_SEC

    dann hat er ja immer noch sekunden.
    🙂



  • ;fricky schrieb:

    monstermunchkin schrieb:

    / CLOCKS_PER_SEC

    dann hat er ja immer noch sekunden.
    🙂

    ... die will er ja auch, nur noch etwas genauer 🙂



  • Danke, bekomme aber immer eine Sekunde als Ergebnis:

    #include <stdio.h>
    #include <time.h>
    
    void file_write(int size, char *path) {
        int i;
        char buffer[1024];
        for (i=0; i<1024; i++) {
            buffer[i] = '0';
        }
        size /= 1024;
        FILE *file = fopen(path, "w");
        for (i=0; i<size; i++) {
            fputs(buffer, file);
        }
        fclose(file);
    }
    
    int main() {
        int size = 500 * 1024 * 1024;
        clock_t start, end;
        float diff, data_rate;
        start = clock() / CLOCKS_PER_SEC;
        file_write(size, "ttt");
        end = clock() / CLOCKS_PER_SEC;
        diff = end - start;
        data_rate = size / (1024 *1024) / diff;
        printf("Sekunden: %.2f\n", diff);
        printf("Datenrate: %.2fMB/s\n", data_rate);
        return 0;
    }
    

    Was mache ich da falsch?



  • clock() / (float)CLOCKS_PER_SEC
    sonst hast du nur ne integer-division mit integer als ergebnis.



  • Danke, das mit gettimeofday hat auf meinem Mac nicht funktioniert...;)



  • ahojnnes schrieb:

    Was mache ich da falsch?

    start und end müssen vom Typ float sein.



  • Allerdings muss ich gerade feststellen, dass die Variante mit clock ungeiignet ist für diesen Performance Test, da die Werte nicht stimmen und ich auf Werte von 500MB/s komme.

    Wie könnte man das sonst noch angehen?



  • ahojnnes schrieb:

    Wie könnte man das sonst noch angehen?

    nehme er eine systemspezifische timerfunktion. die haben meistens millisekunden-auflösung.
    🙂



  • Danke, habe es nun auf einer anderen Platform mit gettimeofday umgesetzt und funktioniert wunderbar:

    #include <stdio.h>
    #include <time.h>
    #include <sys/time.h>
    
    void file_write(int size, char *path) {
        int i;
        char buffer[1024];
        for (i=0; i<1024; i++) {
            buffer[i] = '0';
        }
        size /= 1024;
        FILE *file = fopen(path, "w");
        for (i=0; i<size; i++) {
            fputs(buffer, file);
        }
        fclose(file);
    }
    
    int main() {
        int size = 200 * 1024 * 1024;
        struct timeval start, end;
        float diff, data_rate;
        gettimeofday(&start, NULL);
        file_write(size, "ttt");
        gettimeofday(&end, NULL);
        diff = end.tv_sec - start.tv_sec;
        diff += (float)(end.tv_usec - start.tv_usec) / (1000*1000);
        data_rate = size / (1024*1024) / diff;
        printf("Sekunden: %.2f\n", diff);
        printf("Datenrate: %.2fMB/s\n", data_rate);
        return 0;
    }
    


  • gettimeofday ist dafür nicht geeignet, da es Zeitzonen mit einbezieht. Wenn sich nun die Zeitzone ändert oder jemand an der Uhr dreht (zB durch Umstellung auf Sommerzeit), dann bekommst du falsche Ergebnisse. Nimm lieber man: clock_gettime unter Linux/Unix.



  • Ja, da hast du wahrscheinlich Recht...


Log in to reply