【问题标题】:How can I check how many times a function was called with a 3 seconds interval?如何检查以 3 秒间隔调用函数的次数?
【发布时间】:2013-07-15 17:11:03
【问题描述】:

我想检查我的函数在 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;
}

【问题讨论】:

  • 您的代码不仅仅是衡量您的函数在 3 秒内被调用的次数。您正在测量可以调用函数和 get_wall_time 的次数。
  • @hatchet:好的,将我的while 更改为}while(get_wall_time() &lt; wall0+seconds); 但仍然......结果不正常(与我更改之前几乎相同)
  • 这仍然会为您的函数的每次执行调用 get_wall_time。
  • 我不确切知道您的应用程序的要求是什么,但执行此类操作的一种方法是简单地调用该函数固定次数(例如 1000 次),然后检查时间只是两次——一次在循环之前,一次在循环之后。然后你可以计算每个函数调用的时间,并据此推断你可以在 3 秒内调用它多少次。
  • 如果您想避免(大部分)在每次迭代中获取时间的开销(并且您在 *nix 中),请查看alarm。它会告诉操作系统在时间到时向您发送信号,因此您可以让信号处理程序设置一个(易失性)标志并检查每次迭代。 volatile 读取会增加一点开销,但没有它,您可能会永远运行(取决于优化器的作用)。

标签: c benchmarking


【解决方案1】:

将 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);

【讨论】:

  • 如果 fun(a,b,c) 的执行时间非常短,这仍然会导致大量开销,因为您需要将时间包含在计算调用的时间中好玩。
【解决方案2】:

你可以使用线程等待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(),因为系统调用非常昂贵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2021-07-05
    相关资源
    最近更新 更多