2010-08-30 2 views
3

Я пытался запрограммировать класс Timer (не подозревая, что boost был один), а затем, когда это не сработало, я попытался просто вывести значение clock(), используя этот код :Функция C++ clock(), дающая неправильные значения

#include <ctime> 
#include <iostream> 

int main() 
{ 
for(int i = 0; i < 50; ++i) 
{ 
    std::cout << std::clock() << " "; 
} 
return 0; 
} 

Когда я запускаю программу, я получаю серию из 0s. У меня есть аналогичный опыт при использовании функций спящего потока с ускорением, чтобы растянуть время дольше (хотя через несколько секунд он перескакивает от 0 до 10 000 и продолжает выводить 10 000).

Я запускаю Gentoo Linux. Это платформа? C++ вещь? Что происходит?

Редактировать: Странно прыжок на 10000 происходит после ряда секунд, а не миллисекунды. Когда я спал со своей нитью в течение секунды, понадобилось пять или шесть секунд, чтобы добраться до 10000. Однако, если я правильно понимаю. Время, затрачиваемое нитью, не влияет на счет часов()? (Что будет иметь смысл, почему это будет выполнение тактовых циклов, если он спит?)

+1

Точно. Когда ваш поток спит, система не назначает его CPU, а счетчик 'clock()' заморожен. В вашем примере это только короткие промежутки времени между пробуждением и сном, которые считаются. – slacker

+0

Обратите внимание, что clock() возвращает время процессора для всей программы, суммируя все потоки. См. Http://stackoverflow.com/a/5035854/13422 –

ответ

5

Возвращаемое значение clock() указано в микросекундах. Но типичная гранулярность любого низкоуровневого системного вызова использует использование clock(). Таким образом, кажется, что в вашей системе гранулярность составляет 10 мс. Также обратите внимание, что clock() делает NOT Измерение реального времени - оно измеряет время процессора, используемое программой. Таким образом, время течет, когда ваша программа управляет процессором, и она зависает, когда ваша программа приостановлена ​​- например, спать.

+3

Примечание - это не ** **, чтобы быть микросекундами. (Отсюда причина макроса CLOCKS_PER_SEC) –

+2

http://www.cplusplus.com/reference/clibrary/ctime/clock/. Это говорит о том, что не гарантируется какая-либо конкретная единица. Вы должны использовать макрос CLOCKS_PER_SEC, чтобы найти время в реальных единицах. Что касается разрешения 10 мс, я думаю, что это не очень редко. –

+0

Однако в системе, совместимой с POSIX, она * должна * быть микросекундами ('CLOCKS_PER_SEC' должен быть 1000000). –

0

Разрешение std::clock не определено. В большинстве случаев, это разрешение будет около 10ms. Отсюда скачок.

0

Попробуйте следующее:

 

#include <ctime> 
#include <iostream> 

int main() 
{ 
    for(int i = 0; i < 50; ++i) 
    { 
     for (int j = 0; j < 500; ++j) 
     { 
     std::cout << j << " "; 
     } 
     std::cout << std::endl; 
     std::cout << std::clock() << std::endl; 
    } 
    std::cout << std::endl; 
    return 0; 
}  

В моей системе я вижу возвращаемое значение часов() не оставаясь на 0, пока в какой-то момент она подскакивает до 10000. Он остается на 10000 до конца. Если я удалю std :: cout во внутреннем цикле, возвращаемое значение clock() останется на 0 полностью. Похоже, clock() возвращает значения только с шагом 10000.

Если изменить внутренний цикл для вычисления квадратного корня из J и печатать возвращаемое значение SQRT(), возвращаемое значение часов() идет до 50000, но по-прежнему увеличивается с шагом 10000.

0

на моей 64-битной операционной системе скорость CLOCKS_PER_SEC равна 1000. Значения часов поступают в миллисекундах. идеальное время будет извлечено из кода ниже.

int main(){ 

clock_t a,b; 
int c,d,e,f; 
c=clock(); 
scanf("%d",&e); 
d=clock(); 
f=(d-c)/CLOCKS_PER_SECOND; 
printf("timing is %d seconds",f);/*for 64 bit operating system   
CLOCKS_PER_SECOND is 1000*/ 




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