我想创建一个函数来测量任何作为参数传递的函数的执行时间,无论传递的函数有多少个参数。
#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
个参数传递给{ {1}}功能。
因此,例如,作为measureTime
传递的函数可以包含任意数量的参数,ptr
仍然有效。
measureTime
如果以上可以起作用,那么主要是什么样的?
答案 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中进行回调。没有意识到这不可能是我想要的方式。