C/C++

[ C ] Что делать, если точности clock() не хватает?

Использую Windows и MSVC. Макрос CLOCKS_PER_SEC определён как 1000, точности которого не хватает для определения времени выполнения в некоторых случаях. Какие есть способы получить более точное время выполнения на моей платформе?
В time.h есть функция clock_gettime для точного получения количества тиков от разных таймеров
 #include  

int clock_gettime(clockid_t clk_id, struct timespec *tp);
Функция соответствует стандартам POSIX.1-2001, POSIX.1-2008 так что есть вероятность, что она будет доступна и в Windows
clk_id - это идентификатор типа таймера. Для измерения интервалов стоит попробовать использовать CLOCK_MONOTONIC, если же нужно системное время - то CLOCK_REALTIME (но показания этих часов могут изменяться службами, отвечающими за точное время в системе).
Второй параметр функции - это структура
 struct timespec
{
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Рядом есть еще функция
 int clock_getres(clockid_t clk_id, struct timespec *res); 
Которая позволяет узнать разрешение выбранного таймера.

Что касается приведенной в ответе def функции rdtsc - это реально хороший, но при этом совершенно не переносимый вариант.
Сергей Ланин
Сергей Ланин
9 624
Лучший ответ
Библиотека chrono есть?
Я хз, что там на этом MSVC сейчас доступно из стандарта.
 const std::chrono::steady_clock::time_point before = std::chrono::steady_clock::now();
// тут обработка
const std::chrono::steady_clock::time_point after = std::chrono::steady_clock::now();
cout
Эрнис Бексултанов chrono - плюсовая библа
Эрнис Бексултанов Спасибо, порылся в msdn (Которая ныне learn.microsoft.com я в шоке) и в системных вызовах для получения времени. Нашёл ещё парочку интересных вещей.
>>Какие есть способы получить более точное время выполнения на моей платформе?
Способов более точного получения времени не существует (без использования внешней аппаратуры). Потому что таймер для процессора это внешнее устройство и работает оно с помощью аппаратного прерывания (IRQ 8 если память не изменяет xD ) которое загружает подпрограмму (драйвер) которая обрабатывает аппаратные прерывания таймера и слишком частый вызов подпрограммы драйвера сильно нарушит работу процессора.

Но есть нюансы.
Например можно получить не время а количество совершенных тактов процессора с момента последнего сброса счетчика тактов для этого у процессора есть специальный счетчик.
подробнее https://ru.wikipedia.org/wiki/Rdtsc
т.е. с помощью ассемблерной вставки ты можешь получить данные счетчика


  #include  
extern __inline__ uint64_t rdtsc() {
uint64_t x;
__asm__ volatile ("rdtsc\n\tshl $32, %%rdx\n\tor %%rdx, %%rax" : "=a" (x) : : "rdx");
return x;
}
ОН
Олег Неважно
12 593
попробуй библиотеку time.h
Эрнис Бексултанов Директива clock() и макрос CLOCKS_PER_SEC и так подключаются из time.h. CLOCKS_PER_SEC в самой time.h определён как 1000. Проблема не в этом. На других компиляторах и в других средах CLOCKS_PER_SEC определён как 1000000, что даёт возможность clock() получать время в наносекундах, чего я и хочу добиться на своём win + msvc сетапе
Игорь Свирко а для чего тебе такая точность?