Genaue Timestamps



  • 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...


Anmelden zum Antworten