Frage

EDIT: Ich habe gerade mein Problem nach dieser langen Pfosten zu schreiben, jedes kleine Detail zu erklären ... Wenn jemand kann mir eine gute Antwort auf das, was ich falsch mache und wie kann ich das bekommen Ausführungszeit in Sekunden (einen Schwimmer mit 5 Dezimalstellen oder so verwendet wird), werde ich kennzeichnen, dass als angenommen. . Hinweis: Das Problem war, wie ich interpretiert die clock_getttime () man-Seite

Hallo,

Lassen Sie uns sagen, ich habe eine Funktion namens myOperation, dass ich die Ausführungszeit zu messen. Zu messen, ich bin mit clock_gettime() wie es empfehlen war hier in einer der Kommentare.

Mein Lehrer empfiehlt uns es N Zeiten zu messen, so dass wir einen Mittelwert, Standardabweichung und Median für den Abschlussbericht erhalten. Er empfiehlt auch wir myOperation M mal statt nur einem auszuführen. Wenn myOperation ist eine sehr schnelle Bedienung, Mess es M Zeiten ermöglichen es uns, ein Gefühl für die „Echtzeit“, um es dauert; bewirken, dass die Uhr genutzt werden könnte die erforderliche Präzision nicht haben einen solchen Betrieb zu messen. So wird die Ausführung myOperation nur einmal oder M mal wirklich hängt, wenn die Operation selbst lange genug für die Taktgenauigkeit nimmt wir verwenden.

Ich habe Probleme mit der M mal Ausführung handelt. Zunehmender M abnimmt (viel) die endgültige Mittelwert. Welcher Sinn für mich nicht machen. Es ist so im Durchschnitt dauern 3 bis 5 Sekunden, um von Punkt A nach B. Aber dann gehen Sie von A nach B und zurück zu A 5-mal (was 10-mal macht, weil A nach B die gleichen wie B zu A) und Sie, dass messen. Als Sie durch 10 dividieren, ist die durchschnittliche Sie bekommen soll die gleiche durchschnittliche sein dass Sie nehmen Reisen von A nach B, die 3 bis 5 Sekunden.

Dies ist, was ich meinen Code tun wollen, aber es funktioniert nicht. Wenn ich die Anzahl der immer steigenden ich von A nach B und zurück A gehen, wird der Durchschnitt niedriger sein und jedes Mal senken, es macht keinen Sinn für mich.

Genug Theorie, hier ist mein Code:

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

#define MEASUREMENTS 1
#define OPERATIONS   1

typedef struct timespec TimeClock;

TimeClock diffTimeClock(TimeClock start, TimeClock end) {
    TimeClock aux;

    if((end.tv_nsec - start.tv_nsec) < 0) {
        aux.tv_sec = end.tv_sec - start.tv_sec - 1;
        aux.tv_nsec = 1E9 + end.tv_nsec - start.tv_nsec;
    } else {
        aux.tv_sec = end.tv_sec - start.tv_sec;
        aux.tv_nsec = end.tv_nsec - start.tv_nsec;
    }

    return aux;
}

int main(void) {
    TimeClock sTime, eTime, dTime;
    int i, j;

    for(i = 0; i < MEASUREMENTS; i++) {
        printf(" » MEASURE %02d\n", i+1);

        clock_gettime(CLOCK_REALTIME, &sTime);

        for(j = 0; j < OPERATIONS; j++) {
            myOperation();
        }

        clock_gettime(CLOCK_REALTIME, &eTime);

        dTime = diffTimeClock(sTime, eTime);

        printf("   - NSEC (TOTAL): %ld\n", dTime.tv_nsec);
        printf("   - NSEC (OP): %ld\n\n", dTime.tv_nsec / OPERATIONS);
    }

    return 0;
}

Weitere Informationen: Die obige diffTimeClock Funktion ist das Blogbeitrag . Ich ersetzen meinen realen Betrieb mit myOperation(), weil es keinen Sinn macht meine wirklichen Funktionen zu schreiben, wie ich lange Codeblocks schreiben hätte, Sie leicht einen myOperation() mit codieren können, was Sie wollen, den Code kompilieren, wenn Sie es wünschen.

Wie Sie sehen können, OPERATIONS = 1 und die Ergebnisse sind:

 » MEASURE 01
   - NSEC (TOTAL): 27456580
   - NSEC (OP): 27456580

Für OPERATIONS = 100 die Ergebnisse sind:

 » MEASURE 01
   - NSEC (TOTAL): 218929736
   - NSEC (OP): 2189297

Für OPERATIONS = 1000 die Ergebnisse sind:

 » MEASURE 01
   - NSEC (TOTAL): 862834890
   - NSEC (OP): 862834

Für OPERATIONS = 10000 die Ergebnisse sind:

 » MEASURE 01
   - NSEC (TOTAL): 574133641
   - NSEC (OP): 57413

Nun, ich bin kein Mathegenie, weit davon entfernt tatsächlich, aber das macht keinen Sinn für mich auch immer. Ich habe schon darüber mit einem Freund gesprochen, der mit mir an diesem Projekt ist, und er kann auch nicht die Unterschiede verstehen. Ich verstehe nicht, warum der Wert niedriger ist immer und senken, wenn ich OPERATIONS erhöhen. Der Betrieb selbst soll die gleiche Zeit in Anspruch nehmen (im Durchschnitt natürlich nicht die exakt gleiche Zeit), egal wie oft ich es ausführen.

Sie könnten mir sagen, dass das hängt tatsächlich auf die Operation selbst, wobei die Daten gelesen und dass einige Daten bereits im Cache und bla bla sein könnte, aber ich glaube nicht, dass das Problem. In meinem Fall ist das Lesen myOperation 5000 Zeilen Text aus einer CSV-Datei, die Werte von ; trennen und diese Werte in eine Datenstruktur einzufügen. Für jede Iteration, bin ich zu zerstören die Datenstruktur und erneut initialisiert wird.

Nun, da ich daran denke, ich, die denken auch, dass es‚S ein Problem Messzeit mit clock_gettime(), vielleicht Recht Ich verwende es nicht. Ich meine, Blick auf das letzte Beispiel, wo OPERATIONS = 10000. Die Gesamtzeit dauerte es war 574133641ns, die 0,5s grob sein würde; Das ist unmöglich, es dauerte ein paar Minuten, da ich nicht auf den Bildschirm Warte suchen aushielt und ging etwas zu essen.

War es hilfreich?

Lösung

Sie müssen nur Ihre diffTimeClock() Funktion ändern, um die Anzahl der Sekunden Differenz zurück, als double:

double diffTimeClock(TimeClock start, TimeClock end) {
    double diff;

    diff = (end.tv_nsec - start.tv_nsec) / 1E9;
    diff += (end.tv_sec - start.tv_sec);

    return diff;
}

und in der Hauptroutine Änderung dTime zu einem double und dem printfs zu Anzug:

printf("   - SEC (TOTAL): %f\n", dTime);
printf("   - SEC (OP): %f\n\n", dTime / OPERATIONS);

Andere Tipps

Sieht aus wie der Typ Timeclock hat zwei Felder, eines für Sekunden und eine für Nanosekunden. Es macht keinen Sinn, nur mit der Anzahl der Operationen, das ns Feld zu teilen. Sie müssen die gesamte Zeit teilen.

Wenn Sie ein POSIX-System verwenden, wo es gettimeofday () -Funktion können Sie so etwas wie dieses verwenden, um die aktuelle Zeit in Mikrosekunden zu erhalten:

long long timeInMicroseconds(void) {
    struct timeval tv;

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

Der Grund, warum dies sehr praktisch ist, ist, dass zu berechnen, um wie viel Ihre Funktion haben Sie tun müssen, um nur diese:

long long start = timeInMicroseconds();
... do your task N times ...
printf("Total microseconds: %lld", timeInMicroseconds()-start);

So müssen Sie sich nicht mit zwei ganzen Zahlen beschäftigen, einem mit Sekunden und einem mit Mikrosekunden. Addieren und Subtrahieren Zeiten werden in einer offensichtlichen Art und Weise arbeiten.

Ich verwende im Allgemeinen die Zeit () Funktion für diesen. Es zeigt Wanduhr Zeit, aber das ist wirklich das, was ich am Ende egal.

Ein Gotcha mit Performance-Tests ist das Betriebssystem kann Dateisystem damit zusammenhängenden Vorgängen zwischenzuspeichern. So die zweite (und höher) läuft viel schneller als der erste Lauf sein. Sie müssen in der Regel zu Test können Operationen und durchschnittliche Ergebnis ein gutes Gefühl für die Ergebnisse von Änderungen, die Sie zu erhalten. Es gibt so viele Variablen diese Sie das Rauschen herauszufiltern, kann helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top