我目前正在尝试编写一个通用函数来度量另一个函数func执行所需的时间。我能用<time.h>计算时间等等。
我的方法是这样的:
void measure_time(void *(func)(), unsigned loops);现在,如果结果只是在measure_time中打印出来就足够了(稍后我可以让measure_time返回一些信息)。
我能够计算执行时间等等(使用<time.h>),但目前我的问题是,我希望这是一个通用函数,它应该能够接受所有类型的函数'func‘,具有不同的返回类型和不同的参数大小/类型。
目前,我不知道如何给measure_time函数'func‘,让它使用我能够指定的参数来执行它。
例如:
int a[1000] = {15, 53, ..., 42};
void sort_something(int *a, int n_elements) { ... };
void measure_time(sort_somthing(a, 1000), 100);这应该使用参数"a和1000“调用sort_something 100次,并度量执行所需的时间。
如果你需要的话,我非常乐意提供更多的信息。
干杯!
LastSeconds
发布于 2015-10-28 21:30:46
一般计划应是:
void general_timer(void (*function)(void *context), void *context, int loops);这需要一个不返回值的函数,并为上下文接受一个void *参数,并传递上下文。根据需要作为上下文传递的内容,可能是结构的地址,也可能是像FILE *这样简单的地址。
在执行过程中:
void general_timer(void (*function)(void *context), void *context, int loops)
{
Clock clk;
clk_init(&clk);
clk_start(&clk);
for (int i = 0; i < loops; i++
(*function)(context);
clk_stop(&clk);
char buffer[32];
printf("%s seconds for %d iterations\n",
clk_elapsed_microsecs(&clk, buffer, sizeof(buffer)), loops);
}其中,Clock类型和启动clk_的函数是高分辨率定时包的一部分,可以使用任何方便的方法。
您可以将函数调用编写为:
function(context);它的工作原理完全一样。这是更现代的风格;我更喜欢老式的(*function)(context)调用,因为它清楚地表明,function是一个函数指针,而不是函数的名称。YMMV
是的,我确实有这样一个一揽子计划的具体实施。但是,无论您如何实现这个概念,都可以很容易地应用它。
您可能有一个要计时的函数。它可以使用以下结构:
struct TwoFiles
{
FILE *f_in;
FILE *f_out;
};其职能可能是:
void file_copier(void *ctxt)
{
struct TwoFiles *info = ctxt;
char buffer[4096];
size_t bytes;
rewind(info->f_in);
rewind(info->f_out);
while ((bytes = fread(buffer, sizeof(buffer), sizeof(char), info->f_in)) > 0)
{
if (frwite(buffer, bytes, sizeof(char), info->f_out) != bytes)
{
…report error…abandon loop…
}
}
}电话可能是:
struct TwoFiles ctxt;
ctxt.f_in = fopen(some_file_name, "r");
ctxt.f_out = fopen(another_name, "w");
general_timer(file_copier, &ctxt, 100);注意,为了有用,文件复印机函数需要倒带输入和输出文件流,以便每次常规计时器函数调用它时它都能工作。然而,这是手头的具体任务的一个细节。
https://stackoverflow.com/questions/33401549
复制相似问题