Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

[c++] clock() в разных системах.

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> [c++] clock() в разных системах.
Имя
Сообщение << Старые топики   Новые топики >>
[c++] clock() в разных системах. - 2009-05-05 14:20:10.846666   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
Простенький код работает в разных системах по-разному.
#include &lt;time.h&gt; #include &lt;iostream&gt; using namespace std; int main() { clock_t t1, t2; t1 = clock(); sleep(1); t2 = clock(); cout &lt;&lt; "t1 = " &lt;&lt; t1 &lt;&lt; endl; cout &lt;&lt; "t2 = " &lt;&lt; t2 &lt;&lt; endl; return 0; } Mac Os X 10.5.6
$ g++ -o test test.cpp $ ./test t1 = 1698 t2 = 1730 Ubuntu 9.04
$ g++ -o test test.cpp $ ./test t1 = 0 t2 = 0 WTF? Что с функцией clock()?
Post #: 1
RE: [c++] clock() в разных системах. - 2009-05-05 14:42:17.353333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
И что?
NAME clock - Determine processor time SYNOPSIS #include &lt;time.h&gt; clock_t clock(void); DESCRIPTION The clock() function returns an approximation of processor time used by the program. По-русски: описание: Функция clock возвращает приблизительное процессорное время использованное программой.
"Приблизительное" – это к тому, что не страшно, если числа расходятся слегка.
"Использованное программой" – дело в том что время одна секунда sleep использовалась системой по своему усмотрению, но вовсе не твоей программой.

ps. Попробуй заменить sleep(1) на for (unsigned i = 0; i < -1; i ++);
Post #: 2
RE: [c++] clock() в разных системах. - 2009-05-05 15:45:43.700000   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
Короч, наткнулся на эту багу, когда писал прогу, которая работает с /dev/fd0. При чтении большого количество секторов время тратится по нескольку секунд. Но таймер всегда показывал ноль. Именно поэтому решил написать тестовую прогу. Мои предположения оказались верны: в линухе clock почему-то всегда возвращает нули =/
Post #: 3
RE: [c++] clock() в разных системах. - 2009-05-05 16:33:50.386666   
kolPeeX

Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333
На фре тоже нули.
Post #: 4
RE: [c++] clock() в разных системах. - 2009-05-05 21:32:04.073333   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
Проблему как бы решил переходом на <sys/time.h> с его setitimer и getitimer.
С clock'ом так и не разобрался.
Post #: 5
RE: [c++] clock() в разных системах. - 2009-05-06 00:45:50.090000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
блин, я ж привёл кусок кода. Я ж пояснил вроде. Что непонятно?
Другой кусок кода (уже полностью):#include &lt;stdio.h&gt; #include &lt;time.h&gt; int main() { clock_t c1, c2; unsigned i; int j; for (j = 1; j &gt; 0; j *= 2) { c1 = clock (); for (i = 0; i &lt; j; i ++); c2 = clock (); printf ("%9d: c2-c1 = %d\n", j, (int)(c2-c1)); } return 0; } Ещё одна цитата из документации:
quote:

RETURN VALUE
The value returned is the CPU time used so far as a clock_t; to get the
number of seconds used, divide by CLOCKS_PER_SEC. If the processor
time used is not available or its value cannot be represented, the
function returns the value (clock_t) -1.

CONFORMING TO
C89, C99, POSIX.1-2001. POSIX requires that CLOCKS_PER_SEC equals
1000000
independent of the actual resolution.

Всё переводить дословно лень. Суть в том, что числа возвращаемые функцией clock вообще-то вовсе не такты процессора. Это величина кратная им. Константа CLOCKS_PER_SEC позволяет перевести это дело в секунды. Теперь для понимания осталось лишь помедитировать над этим. Чтобы войти в нирвану было бы проще, подскажу, что надо обратить внимание на порядок числа CLOCKS_PER_SEC и порядок значения частоты современного процессора.
Учитывая мой предыдущий пост, можно добавить, что
1. числа приблизительные, и…
2. это не время прошедшее между двумя вызовами clock, а время которое процессор провёл выполняя код _программы_, а не ядра или других процессов.
И из этого сделать уже очевидный вывод: если происходит работа с устройством, то такой способ измерения времени может подойти лишь если промежуток времени маленький. Порядка периода переключения задач ядром и даже меньше. Если речь идёт о полусекундах, секундах и больше, то лучше искать другой способ. То есть, если речь идёт о программировании флоповода, то выбор в пользу setitimer был куда как более правильным, нежели использование clock. ;)
Post #: 6
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> [c++] clock() в разных системах.







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.