2013-06-14 3 views
1

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

Спасибо за помощь до сих пор, но я действительно не могу получить хроно-произведение, работающее в VS'12, но оно прекрасно, потому что я думаю, что это немного больше, чем мне нужно, я думал об использовании времени(), но я понятия не имею, как преобразовать t_time в int, который содержит только текущие секунды 0-60, любую помощь?

+0

Если вы беспокоитесь об этом, посмотрите на часы librt clock_gettime (CLOCK_MONOTONIC, ...). Это может быть больше в соответствии с тем, что вы хотите, при условии, что вам разрешено использовать библиотеку librt. –

ответ

3

Насколько стандарт касается,

Диапазон и точность времени, изображаемых в clock_t и time_t зависят от реализации.

(С99, §7.23.1 ¶4)

так что нет никаких гарантий диапазона; определение clock() ничего не знаю о обтекании не говорит, хотя он говорит, что

Если процессорное время используется не доступно или его значение не может быть представлено, функция возвращает значение (clock_t)(-1)

Так мы можем сказать, что превышение диапазона clock_t можно рассматривать как «его значение не может быть представлено»; с другой стороны, эта интерпретация означала бы, что через некоторое время clock() станет совершенно бесполезным.

В фактах, если мы перейдем к конкретной реализации (glibc), мы видим:

[email protected]:~$ man 3 clock 
Note that the time can wrap around. On a 32-bit system where 
    CLOCKS_PER_SEC equals 1000000 this function will return the same value 
    approximately every 72 minutes. 
1

Зависит от того, какую систему вы находитесь. Он может использовать 32 + или 64-битный clock_t. Он определенно перевернется, но если он будет 64-битным, все будет хорошо в течение некоторого времени, прежде чем он перевернется - 2 микросекунды по-прежнему очень долгое время (около 2 секунд, а их около 2 секунд в день, так что 2 дней - это около 2 , или миллион, лет ...;)

конечно, в 32-битной системе, мы имеем около 2 = 4096 секунд при разрешении микросекунд. Час 3600 с = около 1h10m.

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

И, конечно, хотя CLOCKS_PER_SEC может быть 1000000, это не означает, что вы получаете результат в микросекундах - во многих системах он «скачет» на 10000 единиц за раз.

Таким образом, «возможно, плохая идея».

Если у вас есть C++ 11 в системе, используйте std::chrono, которая имеет несколько вариантов для хронометража, которые достаточно хороши для большинства целей (но изучить std::chrono docs)

Пример кода:

#include <iostream> 
#include <chrono> 
#include <unistd.h> // replace with "windows.h" if needed. 

int main() 
{ 
    std::chrono::time_point<std::chrono::system_clock> start, end; 

    start = std::chrono::system_clock::now(); 
// 10 seconds on a unix system. Sleep(10000) on windows will be the same thing 
    sleep(10); 
    end = std::chrono::system_clock::now(); 

    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds> 
          (end-start).count(); 
    std::cout << "elapsed time: " << elapsed_seconds << "s\n"; 
} 
+0

спасибо, у меня было много неприятностей с хроно, но как вы думаете, вы могли бы дать мне код, где он просто возвращает количество секунд с момента последнего вызова? –

+0

Пример добавлен ... –

+0

'std :: this_thread :: sleep_for (std :: chrono :: seconds (10));' эквивалент C++ 11 для 'sleep' (может быть не поддерживается в некоторых компиляторах) – milleniumbug

0

Простой ответ заключается в том, что если вы просто используете его во времени для функции, это, вероятно, не обернется. Это также может быть слишком медленным, и, скорее всего, вы можете увидеть длительность функции ноль. Если вам нужна точная синхронизация для функции, которая выполняется быстро, вы, вероятно, лучше используете вызов уровня ОС, такой как this one on Windows.

 Смежные вопросы

  • Нет связанных вопросов^_^