Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 时钟错了_C_Time - Fatal编程技术网

C 时钟错了

C 时钟错了,c,time,C,Time,我有一个计算发送或接收大量数据的时间的程序。当我收到数据时,时钟说它只需要实际时间的一半 接收数据的终端的输出: Amount of data recived: 60296112/300000000 Time: 4 Start time: 3269 End time: 4849790 Clocks per sec: 1000000 Sent 300000000 bytes of data Time to send was 10.793425 以及来自发送数据的终端的输出: Amount of

我有一个计算发送或接收大量数据的时间的程序。当我收到数据时,时钟说它只需要实际时间的一半

接收数据的终端的输出:

Amount of data recived: 60296112/300000000
Time: 4
Start time: 3269
End time: 4849790
Clocks per sec: 1000000
Sent 300000000 bytes of data
Time to send was 10.793425
以及来自发送数据的终端的输出:

Amount of data recived: 60296112/300000000
Time: 4
Start time: 3269
End time: 4849790
Clocks per sec: 1000000
Sent 300000000 bytes of data
Time to send was 10.793425
发送数据的终端将在发送所有其他数据后发送停止信号。当我观察接收数据的终端时,我可以看到当另一个终端开始发送数据时,它开始计数,并且我可以看到它从
clock()
打印输出的时间比输出显示的时间长

接收部件的我的代码:

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);
        }
    }
} 
static void recive\u sock(int socket\u fd,char*buffert,size\u t buffert\u size,struct sockaddr*other,socklen\u t*other\u size){
时钟开始,结束;
长整数总时间=0;
printf(“数据列表\n”);
fflush(stdout);
int run=1;
char start=1;
整数金额=0;
接收长度;
while(运行){
接收长度=recvfrom(套接字fd、缓冲区、缓冲区大小、0、其他、其他大小);
如果(接收长度<0){
模具(“Recvfrom失败”);
}
if(strncmp(buffert,“HELLO!”,6)==0){
金额+=接收长度;
如果(开始==1){
开始=0;
开始时间=时钟();
printf(“开始:%ld\n”,开始\u t);
}
printf(“%ld\n”,clock());
}
否则如果(strncmp(buffert,“die”,3)=0){
run=0;
end_t=时钟();
printf(“结束%ld\n”,结束);
总时间=(结束-开始)/时钟/秒;
printf(“接收的数据量:%d/%d\n时间:%ld\n开始时间:%ld\n开始时间:%ld\n,每秒时钟数:%ld”,数量,数量,总时间,开始时间,结束时间,每秒时钟数);
}
}
} 

函数
clock
将返回CPU时间,这可能不是您要查找的,相反,您希望对支持它的系统使用类似
gettimeofday
clock\u gettime
的内容。然后您可以比较之前和之后的时间以获得经过的时间。对于未来的读者,如果您的系统支持,下面介绍如何使用
clock\u gettime

#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;
}

函数
clock
将返回CPU时间,这可能不是您要查找的时间,相反,您希望对支持它的系统使用类似
gettimeofday
clock\u gettime
的内容。然后您可以比较之前和之后的时间以获得经过的时间。对于未来的读者,如果您的系统支持,下面介绍如何使用
clock\u gettime

#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;
}

clock()
返回处理器使用的时间,而不是经过的时间。更多信息:您确定在开始发送数据后立即发送数据吗?可能存在延迟发送的内部缓冲,直到有足够的数据发送。我认为发送数据的代码在这里是非常相关的。1)
if(recive_length<0){
Check for EAGAIN here 2)
if(strncmp(buffert,“die”,3)==0){
TCP是基于流的,它不保留“消息边界”,你的“die”关键字可以在缓冲区的任何地方,甚至可以跨段。
clock()
返回处理器使用的时间,而不是经过的时间。更多信息:您确定数据在开始发送后立即发送吗?可能有内部缓冲延迟发送,直到有足够的数据发送。我认为发送数据的代码在这里非常相关。1)
如果(接收长度<0){
在这里检查EAGAIN 2)
如果(strncmp(buffert,“die”,3)==0){
TCP是基于流的,它不保留“消息边界”,您的“die”关键字可以在缓冲区中的任何位置,甚至可以跨段。
(t2.tv_usec-t1.tv_usec)/1000.0;
注意符号。使用绝对差。您永远不希望使用gettimeofday来测量经过的时间。用于此目的的函数是错误的。请使用适当的Posix函数-clock_gettime@Xofo我知道有高分辨率计时器,它们更适合测量经过的时间。但是,它的支持范围不如其他计时器广泛
gettimeofday
这是一个很好的选择,如果你想在平台支持上权衡准确性。我添加了一个示例,演示如何使用
clock\u gettime
>gettimeofday如果我记得正确,在一些嵌入式系统(如VxWorks)上是不可用的并且不是Posix函数,实际上被开放组()弃用了……我也有过在嵌入式板上使用它的黑客版本的糟糕经历。@Xofo哦,很有趣。谢谢你让我知道。
(t2.tv_usec-t1.tv_usec)/1000.0;
注意符号。使用绝对差。您永远不希望使用gettimeofday来测量经过的时间。用于此目的的函数是错误的。请使用适当的Posix函数-clock_gettime@Xofo我知道有高分辨率计时器,它们更适合测量经过的时间。但是,它的支持范围不如其他计时器广泛
gettimeofday
这是一个很好的选择,如果你想在平台支持上权衡准确性。我添加了一个示例,演示如何使用
clock\u gettime
>gettimeofday如果我记得正确,在一些嵌入式系统(如VxWorks)上是不可用的它不是Posix函数,实际上被开放组()弃用了……我也有过在嵌入式板上使用它的黑客版本的糟糕经历。@Xofo哦,很有趣。谢谢你让我知道。