#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