LINUX.ORG.RU

Один из способов -- читать счетчик тиков процессора.
Макрос для gcc
#define rdtscll(val) __asm__ __volatile__("rdtsc" :"=A"(val))
// Type of val --- unsigned long long
#endif

rdtscll(long long & val) записывает в переменную
val число тиков процессора с момента перезагрузки машины.
Сам вызов функции занимает около 30 тиков.

Все современные процессоры обладают кэшем (область быстродоступной
памяти), если данные находятся в кэше то доступ к ним относительно
бесплатен, если данные находятся в далекой области памяти то
доступ занимает гораздо больше времени. Поэтому, первый вызов
кода может выполняться значительно дольше чем, последующие, и для
правильного измерения времени необходимо несколько раз повторить
процесс.

Пример измерения времени выполнения функции sqrt.
int main(){
const int num=7;
long long c1[num], c2[num];
double tmp;
for (int i=0; i<num; i++){
rdtscll(c1[i]);
tmp=sqrt(d2*i);
rdtscll(c2[i]);
}
for (int i=0; i<num; i++) cout << c2[i]-c1[i] << '\t';
cout << endl;
return 0;
}

Результатом выполнения будет примерно следующая строка:
5906 113 113 113 113 113 113

Таким образом, тело цикла занимает 113 тиков, из них приблизительно 40 тиков занимает работа со счетчикам, и на sqrt остается 73.

Точность измерений таким способом составляет примерно 20 тиков. Большей точности не добиться, так как время выполнения
начинает зависеть от того какой код окружает измеряемый участок.
Эта ошибка может составляет примерно 10-20 тиков, конечно без провала
на первый вызов.

pru

anonymous
()
Ответ на: комментарий от amm

Нужно определить оптимальный по скорости метод

kianvl
() автор топика
Ответ на: комментарий от anonymous

Спасибо за подробную инструкцию! А как перевести тики в секунды? Поделить на тактовую частоту процессора?

kianvl
() автор топика
Ответ на: комментарий от kianvl

! А как перевести тики в секунды? Поделить на тактовую частоту процессора?

Точно.

Хотя в тиках информация о коде более полезна. Эта величина
меньше зависит от свойств процессора и машины.

pru

anonymous
()

#include <time.h>

...
clock_t t=clock();
участок на котором замеряется время
t=clock()-t;
printf("Time: %lf\n", double(t)/CLOCKS_PER_SEC);

fghj ★★★★★
()
Ответ на: комментарий от Dead

>там же вроде как точность до одной микросекунды.

да да меряй дальше на не real-time системе =) Каждый раз разные значения - точно не узнаешь, в списке расслыки linux-c-development - тред такой был - меряли по разному итог один - не измерить точно =)

alphex_kaanoken ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.