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

标签 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 n1 n2 参数到 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 会是什么样子呢?

最佳答案

在 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 - 测量作为参数传递的任何函数的执行时间的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30360617/

相关文章:

c - 如何在 C 中制作 char** 的副本?

c - 取消引用 C 中的函数指针以访问 CODE 内存

c++ - 自 C++20 以来保持或传递不可寻址的函数

c - 什么 ((void (*)())buf)();意思?

比较C中的两个数组,逐个元素

c - 循环依赖

c - 是否可以在 C 中编写您自己的 kbhit()?

c - 如何避免 C 中的这种段错误?

c++ - 将指定函数赋值给函数成员指针?

c++ - 使用非捕获 lambda 作为可变参数模板函数的函数指针参数给出 "no matching function call"