执行时间测量的一般功能

时间:2015-10-28 21:02:51

标签: c function pointers reference

我目前正在尝试编写一个通用函数来衡量另一个函数update a, b set a.alpha = b.alpha where a.id = b.id and a.alpha not in ( select alpha from b b1 where b1.id = a.id ) and b.beta = ( select max(beta) from b b2 where b2.id = a.id ) 执行所需的时间。我可以使用func等计算时间。

我的方法看起来像这样:

<time.h>

现在只要在 void measure_time(void *(func)(), unsigned loops); 内打印结果就足够了(以后我可以让measure_time返回一些信息)。

我能够计算执行时间等等(使用measure_time)但是目前我的问题是我希望这是一个一般功能而且它应该能够采取各种功能&#39; func&#39;具有不同的返回类型和不同的参数大小/类型。

目前我不知道如何设法<time.h>功能&#39; func&#39;让它用我能指定的参数执行它。

例如:

measure_time

这应该使用参数&#34; a和1000&#34;来调用int a[1000] = {15, 53, ..., 42}; void sort_something(int *a, int n_elements) { ... }; void measure_time(sort_somthing(a, 1000), 100); 100次。并测量执行所需的时间。

如果您需要,我非常乐意提供更多信息。

干杯!

LastSeconds

1 个答案:

答案 0 :(得分:2)

一般方案应该是:

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);

请注意,为了有用,文件复制程序功能需要回退输入和输出文件流,以便每次通用计时器函数调用它时它都能正常工作。然而,这是现有具体任务的细节。