我想创建一个函数来测量作为参数传递的任何函数的执行时间,无论传递的函数有多少参数。
#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/