Время выполнения в нано секундах и связанные с этим вопросы - PullRequest
0 голосов
/ 27 мая 2010

Я использую следующий код для вычисления времени выполнения в миллисекундах.

struct timespec tp;
 if (clock_gettime (CLOCK_REALTIME, &tp) == 0)
  return ((tp.tv_sec * 1000000000) + tp.tv_nsec);
 else
  return ;

Подскажите, пожалуйста, правильно ли это? Назовем эту функцию comptime_nano ().

Теперь я пишу следующий код в main () для проверки времени выполнения следующих операций.

 unsigned long int a, b, s1, s3;
 a = (unsigned long int)(1) << 63;
 b = (unsigned long int)(1) << 63;
 btime = comptime_nano();
 s1 = b >> 30;
 atime = comptime_nano();
 printf ("Time =%ld for %lu\n", (atime - btime), s1);
 btime = comptime_nano();
 s3 = a >> 1;
 atime = comptime_nano();
 printf ("Time =%ld for %lu\n", (atime - btime), s3);

К моему удивлению, первая операция занимает примерно в 4 раза больше времени, чем вторая. Опять же, если я изменю относительный порядок этих операций, соответствующие временные рамки резко изменятся.

Пожалуйста, прокомментируйте ...

Ответы [ 2 ]

3 голосов
/ 27 мая 2010

clock_gettime недостаточно точен для такого рода измерений. Если вам нужно измерить подобные операции, сделайте операцию несколько тысяч (или несколько миллионов раз) в цикле перед сравнением. Две вышеописанные операции должны занимать одинаковое количество времени, но вторая в вашем примере кода не требует дополнительных затрат на загрузку a, b, s1 и s3 в кэш процессора.

Кроме того, что здесь происходит?

struct timespec tp;
 if (clock_gettime (CLOCK_REALTIME, &tp) == 0)
  return ((tp.tv_sec * 1000000000) + tp.tv_nsec);
 else
  return ;

Первый возврат недопустим, если функция возвращает void, а второй недопустим, если он не возвращает void ....

РЕДАКТИРОВАТЬ: 1000000000 также выходит за пределы диапазона int.

0 голосов
/ 27 мая 2010

Если ваше разрешение недостаточно хорошее и вы работаете на ПК Intel, попробуйте использовать счетчик меток времени в реальном времени (RDTSC). Я нашел этот код для использования на Umbutu:

#include<sys/time.h>
#include<time.h>
typedef unsigned long long ticks;

static __inline__ ticks getticks(void)
{
     unsigned a, d;
     asm("cpuid");
     asm volatile("rdtsc" : "=a" (a), "=d" (d));

     return (((ticks)a) | (((ticks)d) << 32));
}
...