РЕДАКТИРОВАТЬ: я исправил это! Итак, теперь мой вопрос состоит в том, как сделать внутреннюю l oop не избыточной, поскольку я все еще хочу, чтобы переменная итерации считалась. В этом коде tst:
template <class T>
void tst(T(*f)(T*, int), T* arr, long long c, int reps, long long its, long long& ctr, T& res) {
high_resolution_clock::time_point time1, time2;
nanoseconds dur;
time1 = steady_clock::now();
res = (f)(arr, c);
for (int i = 0; i < reps; ++i) for (long long j = 0; j < its; ++j) (f)(arr, c);
time2 = steady_clock::now();
dur = duration_cast<nanoseconds>(time2 - time1);
ctr += dur.count();
ctr /= reps;
}
Возвращенные значения верны. Время до первого вызова для сохранения результата: res = (f)(arr, c);
работает. Я предполагаю, что поскольку более поздние вызовы имеют ту же функцию, они были оптимизированы из существования!
Оригинальный вопрос:
Я изучал способы встроенных функций в Visual Studio 19 C ++, чтобы сделать некоторые основы c бенчмаркинга.
Тест состоит в том, чтобы иметь большой массив значений и суммировать их как можно быстрее (я знаю, что это не очень хорошее использование встроенных функций, которые я только изучаю).
В режиме отладки код выполняется нормально, хотя и очень медленно, но показанные значения времени разумны. Однако в режиме освобождения функции утверждают, что выполнялись примерно за 30 наносекунд, что просто невозможно. В среднем выполнение кода занимает 12 секунд, однако функция tst сообщает, что эти 12 секунд были, по сути, просто долями секунды. Показанное время не меняется, поскольку я изменяю размер массива и количество итераций, хотя это, очевидно, и должно происходить при использовании режима отладки.
Я использую все доступные оптимизации компилятора, включая avx и max inlining et c. Возможно, встраивание мешает работе функции tst?
Это настройки:
static const unsigned long long iterations = (long long)0xFFFFFFFFFFFFFFFF;
static const unsigned long long arrSize = (long long)0xFFFFFFF;
static const unsigned int repeats = 1
А затем клавиша, имеющая недостатки в режиме разблокировки, функция tst ():
template <class T>
void tst(T(*f)(T*, int), T* arr, long long c, int reps, long long its, long long& ctr, T& res) {
high_resolution_clock::time_point time1, time2;
nanoseconds dur;
res = (f)(arr, c);
for (int i = 0; i < reps; ++i) {
time1 = steady_clock::now();
for (long long j = 0; j < its; ++j) {
(f)(arr, c);
}
time2 = steady_clock::now();
dur = duration_cast<nanoseconds>(time2 - time1);
ctr += dur.count();
}
ctr /= reps;
}