C 如何检查以3秒间隔调用函数的次数?

C 如何检查以3秒间隔调用函数的次数?,c,benchmarking,C,Benchmarking,我想检查我的功能在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 (get

我想检查我的功能在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;
}
编辑:

像这样的

#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;
}
#包括
#包括
#包括
#包括
/*3秒*/
挥发性整数秒=3;
无效句柄(int-sig){
--秒;
警报(1);
}
int main()
{
信号机(信号机、手柄);
警报(1);
while(秒)
{
乐趣(a、b、c);
迭代++;
}
printf(“%lu\n”,迭代次数);
返回0;
}

将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);
struct timeval开始、结束;
做{
gettimeofday(&start,NULL);
乐趣(a、b、c);
gettimeofday(&end,NULL);
迭代++;
现在=(end.tv_sec-start.tv_sec)/1000.0;
现在+=(end.tv\u usec-start.tv\u usec)*1000.0;
}而(现在<3000);

您可以使用线程等待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);
}
#包括
#包括
字符标志=0;
无效*计时器(无效*参数)
{
睡眠(3);
flag=1;
返回(0);
}
int main()
{
整数计数=0;
pthread_t tid;
pthread_create(&tid,NULL,timer,NULL);
while(标志==0)
{
乐趣(a、b、c);
计数++;
}
printf(“%i\n”,计数);
}
并使用gcc使用库pthread
-lpthread
进行编译


我避免使用gettimeofday(),因为系统调用的成本非常高。

您的代码不仅仅是测量在3秒内调用函数的次数。您正在测量可以调用函数并获取时间的次数。@hatchet:好的,将我的
while
更改为
}while(获取时间()但仍然。。。结果不正常(几乎与我更改它之前的结果相同),每次执行函数仍将调用get_wall_time。我不知道你的应用程序的具体要求是什么,但这样做的一种方法是只调用函数固定次数(例如1000次),并且只检查两次时间-一次在循环之前,一次在循环之后。然后,您可以计算每个函数调用的时间,并由此推断出在3秒内可以调用它的次数。如果您想避免(大部分)每次迭代获取时间的开销(并且您处于*nix),请查看
报警
。它会告诉操作系统在时间结束时向您发送一个信号,这样您就可以让信号处理程序设置一个(volatile)标志,并检查每个迭代是否正确。易失性读取会增加一点开销,但如果没有它,您可能会永远运行(取决于优化器所做的)。如果fun(A、b、c)的执行时间非常短,这仍然会导致大量开销,即在计算fun调用的时间时间,将时间包括在内。
#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);
}