我想查看我的功能可以在3秒内运行多少次。我写了那段代码:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/resource.h>
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
// Handle error
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
int main(int argc, char **argv)
{
long iterations = 0;
double seconds = 3.0;
double wall0 = get_wall_time(), now;
do
{
fun(a,b,c);
now = get_wall_time();
iterations++;
}while(now < wall0+seconds);
printf("%lu\n", iterations);
return 0;
}
但有些东西告诉我它根本不行......我将结果与我老师的可执行文件进行了比较,结果表明他的程序在相同的3秒时间间隔内完成了比我的更多的迭代(fun
定义相同,老师给了我它的来源,我只在这里使用它。)
编辑:
编辑while
循环但结果仍然相同:
do
{
fun(a,b,c);
iterations++;
}while(get_wall_time() < wall0+seconds);
编辑:
这样的事情? :#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
/* 3 seconds */
volatile int seconds = 3;
void handle(int sig) {
--seconds;
alarm(1);
}
int main()
{
signal(SIGALRM, handle);
alarm(1);
while(seconds)
{
fun(a,b,c);
iterations++;
}
printf("%lu\n", iterations);
return 0;
}
答案 0 :(得分:4)
在函数中包装gettimeofday会增加迭代次数。比你的教授。你应该这样做:
struct timeval start, end;
do{
gettimeofday(&start,NULL);
fun(a,b,c);
gettimeofday(&end,NULL);
iterations++;
now = (end.tv_sec - start.tv_sec)/1000.0;
now += (end.tv_usec - start.tv_usec)*1000.0;
}while(now < 3000);
答案 1 :(得分:1)
您可以使用线程等待3秒。
#include <pthread.h>
#include <stdio.h>
char flag = 0;
void * timer(void *param)
{
sleep(3);
flag = 1;
return (0);
}
int main()
{
int count = 0;
pthread_t tid;
pthread_create(&tid, NULL, timer, NULL);
while (flag == 0)
{
fun(a,b,c);
count++;
}
printf("%i\n", count);
}
使用gcc
编译库pthread-lpthread
我避免使用gettimeofday(),因为系统调用非常昂贵。