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哦,很有趣。谢谢你让我知道。