затраченное время в C

#include <time.h> 
time_t start,end; 
time (&start);
//code here
time (&end); 
double dif = difftime (end,start); 
printf ("Elasped time is %.2lf seconds.", dif ); 

Я получаю 0,000 за время начала и окончания. Я не понимаю источник ошибки.

Также лучше использовать время (начало) и время (конец) или start = clock () и end = clock () для вычисления прошедшего времени.


person suzy    schedule 30.05.2011    source источник
comment
Можете ли вы опубликовать код, который вы рассчитываете? Похоже, вы правильно рассчитываете время, если вам не нужна высокая точность хронометража.   -  person Thomas Owens    schedule 30.05.2011
comment
У меня это отлично работает. Вы проверили значения start и end с помощью отладчика? (Примечание: чтобы проверить это, я помещаю засыпание (1) между временем (начало) и временем (конец).)   -  person Tom    schedule 30.05.2011
comment
Если вам нужны измерения времени с более высоким разрешением, пробовали ли вы clock()?   -  person sverre    schedule 30.05.2011
comment
@sverre: clock() не измеряет абсолютный ход времени. Он измеряет количество времени, потраченного конкретно на этот процесс. Важное различие. Если вы профилируете, вам может понадобиться это; в противном случае вы, вероятно, этого не сделаете.   -  person Lightness Races in Orbit    schedule 30.05.2011


Ответы (6)


В большинстве (практически во всех?) Системах time() имеет дискретность только в одну секунду, поэтому с его помощью невозможно измерить любые доли секунды. Если вы используете Unix, попробуйте вместо этого использовать gettimeofday.

person jwodder    schedule 30.05.2011

Если вы действительно хотите использовать clock(), убедитесь, что вы понимаете, что он измеряет только время ЦП. Кроме того, чтобы преобразовать в секунды, вам нужно разделить на CLOCKS_PER_SEC.

person mhyfritz    schedule 30.05.2011

Короткие отрывки кода обычно не занимают достаточно времени для выполнения в целях профилирования. Распространенный метод состоит в том, чтобы повторить вызов много-много (миллионы) раз, а затем разделить результирующую временную дельту на количество итераций. Псевдокод:

count = 10,000,000

start = readCurrentTime()

loop count times:
    myCode()

end = readCurrentTime()

elapsedTotal = end - start
elapsedForOneIteration = elapsedTotal / count

Если вам нужна точность, вы можете сбрасывать со счетов накладные расходы на цикл. Например:

loop count times:
    myCode()
    myCode()
and measure elapsed1 (2 x count iterations + loop overhead)

loop count times:
    myCode()
and measure elapsed2 (count iterations + loop overhead)

actualElapsed = elapsed1 - elapsed2
(count iterations -- because rest of terms cancel out)
person Ates Goral    schedule 30.05.2011

time имеет (в лучшем случае) второе разрешение. Если ваш код работает намного меньше этого, вы вряд ли заметите разницу.

Используйте профилировщик (например, gprof на * nix, Инструменты в OS X; для Windows см." Профилирование кода C в Windows при использовании Eclipse "), чтобы рассчитать время вашего кода.

person outis    schedule 30.05.2011

Код, который вы используете между измерениями, работает слишком быстро. Просто попробовал ваш код печатать числа от 0 до 99 999, и я получил

Прошедшее время составляет 1,00 секунды.

person DallaRosa    schedule 30.05.2011

Ваш код запускается меньше секунды.

person Lightness Races in Orbit    schedule 30.05.2011