Вопрос: как в обоих случаях вы измеряете время выполнения ? подсчитываете количество тактов, затрачиваемых функцией/алгоритмом ? и однозначные ли результаты получаете?
Покапавшись в интернете:
Измерение интервалов времени в 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;
}