[c++] clock() в разных системах.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
[c++] clock() в разных системах. - 2009-05-05 14:20:10.846666
|
|
|
oRb
Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
|
Простенький код работает в разных системах по-разному. #include <time.h>
#include <iostream>
using namespace std;
int main() {
clock_t t1, t2;
t1 = clock();
sleep(1);
t2 = clock();
cout << "t1 = " << t1 << endl;
cout << "t2 = " << t2 << 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()?
|
|
|
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 <time.h>
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 ++);
|
|
|
RE: [c++] clock() в разных системах. - 2009-05-05 15:45:43.700000
|
|
|
oRb
Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
|
Короч, наткнулся на эту багу, когда писал прогу, которая работает с /dev/fd0. При чтении большого количество секторов время тратится по нескольку секунд. Но таймер всегда показывал ноль. Именно поэтому решил написать тестовую прогу. Мои предположения оказались верны: в линухе clock почему-то всегда возвращает нули =/
|
|
|
RE: [c++] clock() в разных системах. - 2009-05-05 16:33:50.386666
|
|
|
kolPeeX
Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333
|
На фре тоже нули.
|
|
|
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'ом так и не разобрался.
|
|
|
RE: [c++] clock() в разных системах. - 2009-05-06 00:45:50.090000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
блин, я ж привёл кусок кода. Я ж пояснил вроде. Что непонятно? Другой кусок кода (уже полностью):#include <stdio.h>
#include <time.h>
int main()
{
clock_t c1, c2;
unsigned i;
int j;
for (j = 1; j > 0; j *= 2)
{
c1 = clock ();
for (i = 0; i < 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. ;)
|
|
|
|
|