Вопрос: как в обоих случаях вы измеряете время выполнения ? подсчитываете количество тактов, затрачиваемых функцией/алгоритмом ? и однозначные ли результаты получаете?
Покапавшись в интернете:
Измерение интервалов времени в Windows
Максимально точное измерение кода Хабр
Оптимизация длинной арифметики на C++
Как можно подсчитать время работы алгоритма (части программы) __ простенько
C/C++. Измерение времени работы кода с точностью до такта.
измеряем время выполнения понял что для Большого Брата сложно измерить однозначно и точно количество тактов (время) выполнения. Так как каждый раз при новом запуске будем получать разное время выполнения из-за многозадачности Оси и многоядерности процессоров.
У меня разница получалась примерно в 2-3 раза. максимум около 1000 тиков, минимум около 400 ( ниже программа для оценки извлечения корня ) Причем я не уверен, что 400 - это минимум времени исполнения алгоритма .
Приведу простенькую прогу. Запускал в Визуал Студии.
Код
#include <iostream>
#include <ctime>
#include <intrin.h> // для __rdtsc()
#pragma intrinsic(__rdtsc)
int isqrt (unsigned x);
int main() {
double time;
int result;
//константа для задания верхнего предела для цикла for
const int max = 1000000;
const clock_t start = clock();
for(int i = 0; i < max; ++i)
result = isqrt( 10);
time = static_cast< double >( clock() - start ) / CLOCKS_PER_SEC;
std::cout<< "sqrt result: " << result << " avarage time is " << time << std::endl;
std::cout << "CLOCKS_PER_SEC: " << CLOCKS_PER_SEC << std::endl;
std::cout << " time for one isqrt(): " << time / max <<std::endl;
unsigned __int64 startTick, stopTick, ticks;
startTick = __rdtsc();
result = isqrt( 10);
stopTick = __rdtsc();
ticks = stopTick - startTick;
std::cout << " time in Ticks for one isqrt(): " << ticks << std::endl;
std::cin.get();
return 0;
}
int isqrt (unsigned x)
{
unsigned m, y, b;
m = 0x40000000;
y = 0;
while (m != 0) { //16 раз
b = y | m;
y = y >> 1;
if (x >= b) {
x = x - b;
y = y | m;
}
m = m >> 2;
}
return y;
}
#include <ctime>
#include <intrin.h> // для __rdtsc()
#pragma intrinsic(__rdtsc)
int isqrt (unsigned x);
int main() {
double time;
int result;
//константа для задания верхнего предела для цикла for
const int max = 1000000;
const clock_t start = clock();
for(int i = 0; i < max; ++i)
result = isqrt( 10);
time = static_cast< double >( clock() - start ) / CLOCKS_PER_SEC;
std::cout<< "sqrt result: " << result << " avarage time is " << time << std::endl;
std::cout << "CLOCKS_PER_SEC: " << CLOCKS_PER_SEC << std::endl;
std::cout << " time for one isqrt(): " << time / max <<std::endl;
unsigned __int64 startTick, stopTick, ticks;
startTick = __rdtsc();
result = isqrt( 10);
stopTick = __rdtsc();
ticks = stopTick - startTick;
std::cout << " time in Ticks for one isqrt(): " << ticks << std::endl;
std::cin.get();
return 0;
}
int isqrt (unsigned x)
{
unsigned m, y, b;
m = 0x40000000;
y = 0;
while (m != 0) { //16 раз
b = y | m;
y = y >> 1;
if (x >= b) {
x = x - b;
y = y | m;
}
m = m >> 2;
}
return y;
}
упс,глюк словился - две ветки сгенерировалось.
Модераторы, удалите, пожалуйста, одну такую же тему...
Мне вот что кажется.
Коль уж пишу под встраиваемое железо, то достоверней всего замерять именно на целевой платформе (железке), на которой нет ни какой Оси. Тупо шьем программу в процессор. Алгоритм обрамляем в начале и в конце командами дрыгания ножек и уже осциллографом измеряем время выполнения. А там уже, если надо, пересчитываем в количество тиков, исходя из частоты процессора...