首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >执行时间测量的通用函数

执行时间测量的通用函数
EN

Stack Overflow用户
提问于 2015-10-28 21:02:50
回答 1查看 54关注 0票数 0

我目前正在尝试编写一个通用函数来度量另一个函数func执行所需的时间。我能用<time.h>计算时间等等。

我的方法是这样的:

代码语言:javascript
运行
复制
 void measure_time(void *(func)(), unsigned loops);

现在,如果结果只是在measure_time中打印出来就足够了(稍后我可以让measure_time返回一些信息)。

我能够计算执行时间等等(使用<time.h>),但目前我的问题是,我希望这是一个通用函数,它应该能够接受所有类型的函数'func‘,具有不同的返回类型和不同的参数大小/类型。

目前,我不知道如何给measure_time函数'func‘,让它使用我能够指定的参数来执行它。

例如:

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-28 21:30:46

一般计划应是:

代码语言:javascript
运行
复制
void general_timer(void (*function)(void *context), void *context, int loops);

这需要一个不返回值的函数,并为上下文接受一个void *参数,并传递上下文。根据需要作为上下文传递的内容,可能是结构的地址,也可能是像FILE *这样简单的地址。

在执行过程中:

代码语言:javascript
运行
复制
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_的函数是高分辨率定时包的一部分,可以使用任何方便的方法。

您可以将函数调用编写为:

代码语言:javascript
运行
复制
function(context);

它的工作原理完全一样。这是更现代的风格;我更喜欢老式的(*function)(context)调用,因为它清楚地表明,function是一个函数指针,而不是函数的名称。YMMV

是的,我确实有这样一个一揽子计划的具体实施。但是,无论您如何实现这个概念,都可以很容易地应用它。

您可能有一个要计时的函数。它可以使用以下结构:

代码语言:javascript
运行
复制
struct TwoFiles
{
    FILE *f_in;
    FILE *f_out;
};

其职能可能是:

代码语言:javascript
运行
复制
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…
        }
    }
}

电话可能是:

代码语言:javascript
运行
复制
struct TwoFiles ctxt;
ctxt.f_in = fopen(some_file_name, "r");
ctxt.f_out = fopen(another_name, "w");

general_timer(file_copier, &ctxt, 100);

注意,为了有用,文件复印机函数需要倒带输入和输出文件流,以便每次常规计时器函数调用它时它都能工作。然而,这是手头的具体任务的一个细节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33401549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档