测量作为参数传递的任何函数的执行时间的函数
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
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 会是什么样子?
首先要小心,因为 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 中进行回调。没有意识到我想要的方式是不可能的。
我想创建一个函数来测量作为参数传递的任何函数的执行时间,无论传递的函数有多少个参数。
#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 会是什么样子?
首先要小心,因为 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 中进行回调。没有意识到我想要的方式是不可能的。