C/C++
[ C ] Что делать, если точности clock() не хватает?
Использую Windows и MSVC. Макрос CLOCKS_PER_SEC определён как 1000, точности которого не хватает для определения времени выполнения в некоторых случаях. Какие есть способы получить более точное время выполнения на моей платформе?
В time.h есть функция clock_gettime для точного получения количества тиков от разных таймеров
clk_id - это идентификатор типа таймера. Для измерения интервалов стоит попробовать использовать CLOCK_MONOTONIC, если же нужно системное время - то CLOCK_REALTIME (но показания этих часов могут изменяться службами, отвечающими за точное время в системе).
Второй параметр функции - это структура
Что касается приведенной в ответе def функции rdtsc - это реально хороший, но при этом совершенно не переносимый вариант.
#include
int clock_gettime(clockid_t clk_id, struct timespec *tp);
Функция соответствует стандартам POSIX.1-2001, POSIX.1-2008 так что есть вероятность, что она будет доступна и в Windowsclk_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 - это реально хороший, но при этом совершенно не переносимый вариант.
Библиотека chrono есть?
Я хз, что там на этом MSVC сейчас доступно из стандарта.
Я хз, что там на этом 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
т.е. с помощью ассемблерной вставки ты можешь получить данные счетчика
Способов более точного получения времени не существует (без использования внешней аппаратуры). Потому что таймер для процессора это внешнее устройство и работает оно с помощью аппаратного прерывания (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;
}
попробуй библиотеку time.h
Эрнис Бексултанов
Директива clock() и макрос CLOCKS_PER_SEC и так подключаются из time.h. CLOCKS_PER_SEC в самой time.h определён как 1000. Проблема не в этом. На других компиляторах и в других средах CLOCKS_PER_SEC определён как 1000000, что даёт возможность clock() получать время в наносекундах, чего я и хочу добиться на своём win + msvc сетапе
Игорь Свирко
а для чего тебе такая точность?
Похожие вопросы
- Вычислить сумму бесконечного ряда c точностью e=0.0001
- C++. Бинарный поиск. Объясните работу данной программы. Найдите такое число x, что , с точностью не менее 6 зн.С while
- Как получить неограниченную точность для float c++
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?
- Задача по C++
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- Программирование C++ ПРОШУ ПОМОЧЬ!
- Почему создатель Linux Линус Торвальдс называет C++ ужасным языком, а ядро ОС Linux пишется только на Си?
- Сделать перестановку чисел с помощью функции в C++, но у меня получается чепуха
- Задача на C++ (Остатки).