2016-09-23 4 views
0

Ich habe ein Programm, das die Zeit zum Senden oder Empfangen einer Menge von Daten zählt. Wenn ich die Daten erhalte, sagt die Uhr, dass sie nur etwa die Hälfte der Zeit benötigt, die sie tatsächlich benötigt.Falsche Zeit von Uhr

Ausgabe von dem Terminal, das die Daten recives:

Amount of data recived: 60296112/300000000 
Time: 4 
Start time: 3269 
End time: 4849790 
Clocks per sec: 1000000 

und die Ausgabe von dem Endgerät, das die Daten sendet:

Sent 300000000 bytes of data 
Time to send was 10.793425 

Das Terminal, das die Daten sendet, wird ein Stoppsignal senden, nachdem Es hat alle anderen Daten gesendet. Wenn ich das Terminal beobachte, das die Daten empfängt, kann ich sehen, dass es zu zählen beginnt, wenn das andere Terminal beginnt, Daten zu senden, und ich kann sehen, dass es die Ausgabe von clock() viel länger ausgibt, als die Ausgabe sagt.

Mein Code für den Empfangsteil:

static void recive_sock(int socket_fd,char *buffert, size_t buffert_size, struct sockaddr *other, socklen_t *other_size){ 
    clock_t start_t, end_t; 
    long int total_time = 0; 
    printf("Listning for data\n"); 
    fflush(stdout); 
    int run = 1; 
    char start = 1; 
    int amount = 0; 
    int recive_length; 

    while(run){ 
     recive_length = recvfrom(socket_fd, buffert, buffert_size, 0, other, other_size); 
     if(recive_length < 0){ 
      die("Recvfrom failed"); 
     } 
     if(strncmp(buffert, "HELLO!", 6) == 0){ 
      amount += recive_length; 
      if(start == 1){ 
       start = 0; 
       start_t = clock(); 
       printf("Start: %ld\n",start_t); 
      } 
      printf("%ld\n",clock()); 
     } 
     else if (strncmp(buffert, "die", 3) == 0) { 
      run = 0; 
      end_t = clock(); 
      printf("End %ld\n",end_t); 
      total_time = (end_t - start_t)/CLOCKS_PER_SEC; 
      printf("Amount of data recived: %d/%d\nTime: %ld\nStart time: %ld\nEnd time: %ld\n,Clocks per sec: %ld", amount, AMOUNT, total_time, start_t, end_t, CLOCKS_PER_SEC); 
     } 
    } 
} 
+1

'clock()' gibt die Prozessorzeit zurück, nicht die verstrichene Zeit. Mehr hier: http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock.html#tag_16_62 – alk

+0

Sind Sie sicher, dass die Daten tatsächlich sofort nach dem Senden gesendet werden? Möglicherweise gibt es eine interne Pufferung, die das Senden verzögert, bis genügend Daten zum Senden vorhanden sind. Ich denke, dass Code, der die Daten sendet, hier extrem relevant ist. – user694733

+0

1) 'if (recive_length <0) {' Prüfe auf EAGAIN hier 2) 'if (strncmp (buffert," die ", 3) == 0) {' TCP ist strombasiert, es bewahrt keine Nachrichtengrenzen ' , Ihr "Die" -Schlüssel könnte irgendwo im Puffer liegen, vielleicht sogar über Segmente hinweg. – joop

Antwort

3

Die Funktion clock wird die CPU-Zeit zurück, die vermutlich nicht ist, was Sie suchen, stattdessen wollen Sie so etwas wie gettimeofday oder clock_gettime für System verwenden, die Unterstützung es. Dann können Sie die Zeit davor und danach vergleichen, um die verstrichene Zeit zu erhalten. Für zukünftige Leser hier ist, wie es mit clock_gettime zu tun, wenn Ihr System unterstützt:

#include <stdio.h> 
#include <time.h>    // for clock_gettime() 

int main(void) { 
    int i; 
    int j; 
    int sum = 1; 
    struct timespec t1, t2; 
    double elapsedTime; 

    // start timer 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t1); 

    // do something here 
    for (i = 0; i < 10000; i++) { 
     for (j = 0; j < 10000; j++) { 
      sum *= i+j; 
     } 
    } 

    // stop timer 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t2); 

    // compute and print the elapsed time in millisec 
    elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; 
    elapsedTime += (t2.tv_nsec - t1.tv_nsec)/1000000.0; 
    printf("%.3f ms elapsed\n", elapsedTime); 

    return 0; 
} 

Hier ist ein einfaches Beispiel, wie man Zeit mit gettimeofday (weniger genau für hochgenaue Timing) messen:

#include <stdio.h> 
#include <time.h>    // for gettimeofday() 

int main(void) { 
    int i; 
    int j; 
    int sum = 1; 
    struct timeval t1, t2; 
    double elapsedTime; 

    // start timer 
    gettimeofday(&t1, NULL); 

    // do something here 
    for (i = 0; i < 10000; i++) { 
     for (j = 0; j < 10000; j++) { 
      sum *= i+j; 
     } 
    } 

    // stop timer 
    gettimeofday(&t2, NULL); 

    // compute and print the elapsed time in millisec 
    elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; 
    elapsedTime += (t2.tv_usec - t1.tv_usec)/1000.0; 
    printf("%.3f ms elapsed\n", elapsedTime); 

    return 0; 
} 
+1

'(t2.tv_usec - t1.tv_usec)/1000.0;' beachten Sie das Zeichen. Verwenden Sie den absoluten Unterschied. – alk

+0

Niemals möchten Sie gettimeofday verwenden, um die verstrichene Zeit zu messen. Es ist die falsche Funktion für diesen Zweck. Verwenden Sie die entsprechende Posix-Funktion - clock_gettime – Xofo

+0

@Xofo Ich kenne hochauflösende Timer und sie sind besser für die Messung der verstrichenen Zeit geeignet. Es ist jedoch nicht so breit unterstützt wie 'gettimeofday', was eine gute Alternative ist, wenn Sie die Genauigkeit für die Plattformunterstützung abwägen wollen. Ich habe ein Beispiel hinzugefügt, das zeigt, wie man 'clock_gettime' verwendet. – Linus