2009-10-29 3 views
0

У меня есть простая функция бенчмаркинга с использованием функции C clock().неправильные результаты для часов() на 64 бит

start[timerId]=clock(); 
clock_t end; 
float dif_sec; 
end=clock(); 
dif_sec=((float)end-start[timerId])/CLOCKS_PER_SEC; 
printf("%s: %f seconds\n", msg, dif_sec); 

Это отлично работает в 32 бит на Mac OS X, но при компиляции в 64 бита, результаты все неправильно. Зачем?!

+0

Пожалуйста, объясните, что вы ожидаете, и что делает, чтобы у нас была какая-то надежда ответить на ваш вопрос. – pavpanchekha

+0

Вот результат двух последовательных вызовов на одном компьютере, 1-й по 32 бита, а затем в 64 бит. Это примерно занимает одно и то же время, несмотря на то, что печатается. MacBook: Выпуск Alexis $ ./test л boat.ppm output.ppm анализ: 0.030000 секунд процесс: 1.000000 секунд рендеринга: 0.080000 секунд MacBook: Выпуск Alexis $ ./test л boat.ppm output.ppm анализ: 207.559998 секунд процесс: 11289.139648 секунд визуализации: 648.200012 секунд вопрос заключается в том, что часы() возвращает гораздо большее число в 64 бита, в то время как CLOCKS_PER_SEC еще 100. Идеи? – vectorizor

+0

Вы понимаете, что 'clock()' is _processor time_, а не _wall clock time_ правильно? Как вы компилируете 32-разрядный 64-разрядный режим? И, наконец, 'CLOCKS_PER_SEC' обычно определяется как 1 000 000, по крайней мере, то, что есть на моем MacBook Pro, - посмотрите раздел _STANDARDS_ на странице (3) man-страницы. –

ответ

2

Вот что я получил от чистой версии C вашего кода (MacOS X 10.5.8 - Leopard, MacBook Pro):

#include <time.h> 
#include <stdio.h> 

int main(void) 
{ 
    clock_t start = clock(); 
    clock_t end = clock(); 
    float dif_sec = ((float)end-start)/CLOCKS_PER_SEC; 
    printf("%s: %f seconds\n", "difference", dif_sec); 
    printf("%s: %d\n", "CLOCKS_PER_SEC", CLOCKS_PER_SEC); 
    return(0); 
} 

Это, как я скомпилировал его, и побежал, и результаты Я получил:

Osiris JL: gcc -m32 -o xxx-32 xxx.c 
Osiris JL: gcc -m64 -o xxx-64 xxx.c 
Osiris JL: ./xxx-32 
difference: 0.000006 seconds 
CLOCKS_PER_SEC: 1000000 
Osiris JL: ./xxx-64 
difference: 0.000009 seconds 
CLOCKS_PER_SEC: 1000000 
Osiris JL: ./xxx-64 
difference: 0.000003 seconds 
CLOCKS_PER_SEC: 1000000 
Osiris JL: ./xxx-32 
difference: 0.000003 seconds 
CLOCKS_PER_SEC: 1000000 
Osiris JL: 

Выглядит вроде нормально - возможно, скорее, но это нормально; это хорошая новая машина, и не требуется много времени, чтобы сделать две системные вызовы подряд.

+0

clock_t start = clock(); sleep (1); clock_t end = clock(); это дает мне 0.000026 секунд на моей машине, где печатается значение CPS. 1000000 – Ryan

+0

См. справочную страницу POSIX для ['clock()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock.html), где он говорит: '' Функция 'clock()' должна вернуть наилучшее приближение реализации к времени процессора, используемому процессом, с начала эпохи, определенной реализацией, связанной только с вызовом процесса. '' Когда процесс засыпает, он делает не используйте время процессора. –

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