Возможно ли создать функцию синхронизации, которая может вызывать функцию в качестве параметра, затем запускать и засекать время?

#c

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

Комментарии:

1. Вы можете использовать указатель на функцию, которая вам нужна для засекания времени.

Ответ №1:

Вы можете организовать универсальную функцию следующим образом:

  #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;
}
  

или лямбда

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

Ответ №2:

Да, это возможно.

Вот один способ (из многих):

 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([amp;]() { countLastName("Lastname", peopleArray, size); }, 1000);
  

Ответ №3:

Вы можете сделать это на C с использованием указателей на функции. Вы все еще можете сделать это на C , но я думаю, что стандартный способ сделать это сейчас — включить std::function и вызвать его. В вашей функции time просто соедините функцию ввода с вашим методом синхронизации, и это сработает. Дополнительная информация о std:: функция:https://en.cppreference.com/w/cpp/utility/functional/function