测量作为参数传递的任何函数的执行时间的函数

Function that meassures execution time of any function passed as parameter

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

#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 参数measureTime 函数。

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

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

如果上面可以工作,那么 main 会是什么样子?

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

您可以为您的问题创建一个包含您希望的值的结构

像这样

typedef struct values {
   int *v
} *VALUES;

您将在哪里存储您的值。只要你写 a = malloc (N*(sizeof (int))) ,你想存多少就存多少,N 是你要存多少个整数!像这样你可以有 1000000000000 个变量,只有一个,甚至可能为零,这是你的选择,这些变量在程序结束之前不会丢失。您只需要让 ptr 接收一个 VALUES 类型的变量。

访问您刚刚执行的值 价值一; a->v; 好了,就这么简单!

希望我有所帮助。

您需要一种支持 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;
    });
}

在 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() 误用相关的问题。

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