是否可以制作一个计时函数,该函数可以将函数作为参数调用,然后运行并计时?

时间:2019-04-09 09:17:25

标签: c++

所以我有一个分配,其中我的代码必须反复测试函数的运行时间以获得平均值。作业有几个部分必须完成。

我有工作代码,但我希望能够使用某些函数作为参数来调用计时函数...然后让它运行该函数一定的重复次数,然后返回结果。

(这不是分配的要求。我只是想超越要求,并在可能的情况下做一些有趣且独特的事情。)

能够以如下方式调用该函数会很好:

timingRoutine(functionName);

timingRoutine(repetitions, functionName);

任何建议或想法???这有可能吗?

这是我拥有的代码,该代码已经可以用于计时赋值中的countLastName函数。我对此并不感到特别骄傲:

const int TIMING_REPETITIONS = 100000;
clock_t startTime = clock();
for(int i = 0; i < TIMING_REPETITIONS; i++) {
    countLastName("Lastname", peopleArray, size);
}
clock_t endTime = clock();
double testResult = static_cast<double>(endTime - startTime) / CLOCKS_PER_SEC / TIMING_REPETITIONS;

3 个答案:

答案 0 :(得分:3)

您可以安排如下通用函数:

 #include <functional>

double test(std::function<void()> f)
{
    clock_t startTime = clock();
    f();
    clock_t endTime = clock();
    return static_cast<double>(endTime - startTime) / CLOCKS_PER_SEC;
}

然后您可以将函数传递给它:

void somefunction()
{
    const int TIMING_REPETITIONS = 100000;
    for(int i = 0; i < TIMING_REPETITIONS; i++) {
        countLastName("Lastname", peopleArray, size);
    }
}

int main(int argc, char *argv[])
{   
    std::cout << test(somefunction) << std::endl;
    return 0;
}

或lambda

int main(int argc, char *argv[])
{
    auto f = [=]()
    {
        const int TIMING_REPETITIONS = 100000;
        for(int i = 0; i < TIMING_REPETITIONS; i++) {
            countLastName("Lastname", peopleArray, size);
        }
    };

    std::cout << test(f) << std::endl;

    return 0;
}

答案 1 :(得分:1)

是的,有可能。

这是一种(许多)方式:

double time_it(std::function<void()> fn, int repetitions)
{
    clock_t startTime = clock();
    for(int i = 0; i < repetitions; i++) {
        fn();
    }
    clock_t endTime = clock();
    return static_cast<double>(endTime - startTime) / CLOCKS_PER_SEC / repetitions;
}

示例用法:

// With a function pointer:
void foo() { /* Do something... */ }
double fooTime = time_it(foo, 1000);

// With a lambda function:
double lastNameTime = time_it([&]() { countLastName("Lastname", peopleArray, size); }, 1000);

答案 2 :(得分:0)

您可以使用功能指针在C语言中执行此操作。您仍然可以在C ++中执行此操作,但是我认为现在执行此操作的标准方法是在其中添加std :: function并对其进行调用。在您的时间功能中,只需将输入功能夹在您的计时方法中即可。有关std :: function的更多信息:https://en.cppreference.com/w/cpp/utility/functional/function