所以我有一个分配,其中我的代码必须反复测试函数的运行时间以获得平均值。作业有几个部分必须完成。
我有工作代码,但我希望能够使用某些函数作为参数来调用计时函数...然后让它运行该函数一定的重复次数,然后返回结果。
(这不是分配的要求。我只是想超越要求,并在可能的情况下做一些有趣且独特的事情。)
能够以如下方式调用该函数会很好:
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;
答案 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