确保作为参数传递的任何函数的执行时间的函数

时间:2015-05-20 21:22:01

标签: c function-pointers

我想创建一个函数来测量任何作为参数传递的函数的执行时间,无论传递的函数有多少个参数。

#include<stdio.h>
#include<time.h>

typedef void (*FUNC_PTR)(int, int);

void print_range(int n1, int n2)
{
    int i;
    for(i=n1; i<n2; i++){
            printf("%d\n", i);
    }   
}

void measureTime(FUNC_PTR ptr, int n1, int n2)
{
    time_t start_time = clock();
    ptr(n1, n2); 
    time_t end_time = clock();
    printf("%f\n", (double)end_time - start_time);

}

main()
{   
    int n1 = 1, n2 = 1000;
    FUNC_PTR ptr = print_range;
    measureTime(ptr, n1, n2);
}

我让它适用于传递具有2个参数的print_range的特定情况。

有没有办法让measureTime函数执行任何以FUNC_PTR ptr传递的函数,而不必将print_range n1n2个参数传递给{ {1}}功能。

因此,例如,作为measureTime传递的函数可以包含任意数量的参数,ptr仍然有效。

measureTime

如果以上可以起作用,那么主要是什么样的?

4 个答案:

答案 0 :(得分:1)

首先要小心,因为clock()返回时钟周期而不是秒,要获得必须将时钟()的结果除以在time.h中定义的CLOCKS_PER_SEC的秒数。 我想这就是你想要的秒数。如果没有,那就忽略它。

您可以使用您希望的问题值创建一个结构

类似这样的事情

typedef struct values {
   int *v
} *VALUES;

您将存储您的值。只要您编写一个= malloc(N *(sizeof(int))),您可以存储任意多个,其中N是您要存储多少个int!像这样你可以拥有1000000000000个变量,只有一个,甚至可能是零,这是你的选择,这些变量不会丢失,直到程序结束。你只需要让ptr接收VALUES类型的变量。

访问您刚刚执行的值 价值观a; A-&GT; V; 那你就这么简单!

希望我帮助过。

答案 1 :(得分:1)

在C中无法使用函数指针。

希望我相信有一个可行的选择,只要你可以使用它。 它使用宏来包装函数调用而不是中间函数。

这是一个可能的实现:

#include<stdio.h>
#include<time.h>

#define CHECK_TIME(fct, args...) CHECK_TIME_IMPL(fct, __COUNTER__ , args)

#define CONCAT_IMPL( x, y ) x##y
#define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y )

#define CHECK_TIME_IMPL(fct, COUNTER, args...) time_t MACRO_CONCAT(start_time, COUNTER) = clock(); \
  (fct)(args); \
  time_t MACRO_CONCAT(end_time, COUNTER) = clock();     \
  printf("%f\n", (double)MACRO_CONCAT(end_time, COUNTER) - MACRO_CONCAT(start_time, COUNTER));

void print_range(int n1, int n2)
{
  int i;
  for(i=n1; i<n2; i++){
    printf("%d\n", i);
  }
}

void something_else(char c) {
  printf("Char: %c\n", c);
}

void no_param() {printf("Doing nothing\n");}

int main()
{
  int n1 = 1, n2 = 10;

  CHECK_TIME(print_range, n1, n2);
  CHECK_TIME(print_range, n1, n2);
  CHECK_TIME(something_else, 'c');
  CHECK_TIME(no_param);

  return 0;
}

请注意,我没有解决与误用clock()相关的问题。

答案 2 :(得分:0)

您需要一种支持lambda表达式的语言。据我所知,C到目前为止还不支持lambda表达式。以下是一个C ++ 0x片段,展示了如何做到这一点:

#include <iostream>

using namespace std;

template<typename F>
 void timeIt(const F& f) {
    cout << "start..." << endl;
    f();
    cout << "end..." << endl;
}

int f(int n) {
    return n <= 1 ? 1 : n*f(n-1);
}

void main() {
    int n = 20;
    timeIt([n] {
        cout << "result=" << f(n) << endl;
    });
}

答案 3 :(得分:-1)

在做了一些研究之后,我发现我正试图在c中进行回调。没有意识到这不可能是我想要的方式。