2010-10-25 6 views
1

я измерение физического времени между двумя событиями, как это:логического времени по сравнению с физическим временем в Ubuntu Linux

#include <time.h> 
#include <sys/time.h> 

timeval wall_time0; 
timeval wall_time1; 

// start of period measurement 
gettimeofday(&wall_time0 , 0); 

...stuff happening 

// end of period measurement 
gettimeofday(&wall_time1 , 0); 

return ((wall_time1.tv_sec - wall_time0.tv_sec) + ((wall_time1.tv_usec - wall_time0.tv_usec)/(double)1000000)); 

Но сейчас, мне нужен способ измерения логического времени, что нить на самом деле использует. То есть теоретически это должно быть физическое время, меньше времени, затрачиваемого на запуск других потоков и/или системной логики ядра &.

Я думал это был способ сделать это:

clock_t mTime0; 
clock_t mTime1; 

//start of period measurement 
mTime0=clock(); 

... stuff happening 


//end of period measurement 
mTime1=clock(); 
return (mTime1-mTime0)/(double)CLOCKS_PER_SEC; 

но делать несколько измерений, я заметил две проблемы:

1) для некоторых измерений она больше чем физическая (т. е. для определенной петли, физическое время будет 0,2495 .. и «логическое» (измеренное с помощью clock()) будет 0,27, для меньших измерений оно будет округлено до нуля, что приведет к второй выпуск ...)

2) результирующее время кажется намного более грубым, чем одно возвращение gettimeofday

Есть ли лучший способ измерения времени локальной потоки в Linux?

ответ

0

Ok после того, как немного исследования я обнаружил, что getrusage заполняет обе потребности упоминается:

getrusage man page

поэтому в основном требуется код очень похож на то, как я измерить физическое время с gettimeofday, только что теперь я использовать getrusage

#include <time.h> 
#include <sys/time.h> 
#include <sys/resource.h> 

timeval processed_time0; 
timeval processed_time1; 
rusage paramStruct 
// start of period measurement 
int result = getrusage(&paramStruct); 
processed_time0 = paramStruct.ru_utime; 

...stuff happening 

// end of period measurement 
int result = getrusage(&paramStruct); 
processed_time1 = paramStruct.ru_utime; 

return ((processed_time1.tv_sec - processed_time0.tv_sec) + ((processed_time1.tv_usec - processed_time0.tv_usec)/(double)1000000)); 

этот путь дает мне как

1) C Процесс омера текущего потребляется время

2) Разрешение микросекунды

я исследовал Повысьте Date.Time, но в документации нет ничего процесс или пользователя в зависимости от времени системы упоминая, я думаю, что библиотека просто занимаются измерениями физического времени

+0

, похоже, что это решение также не является полным; по-видимому, результат от rusage не будет иметь новое значение до некоторого времени (я предполагаю, что он не получит новое значение до следующего переключения подкачки контекста). Если это предположение является допустимым, значит, нужно выполнить хамкаунд, сохранять физическое время каждый раз при изменении логического времени, то до тех пор, пока логическое время не будет изменено, нужно добавить временную дельту физического времени с момента последнего изменения. И, вероятно, это не совсем точно, так как я не знаю, как далеко до последнего обмена контекстом. Время, чтобы взять это в список рассылки linux – lurscher

+0

, я также пробовал с 'clock_gettime', и результат был чем-то промежуточным между результатами' getrusage' и результатами 'gettimeofday', и поскольку мы в конечном счете после надежной контрольной метрики, Я не уверен, что любой вариант лучше, чем другой, но ... http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/ – lurscher

3

Есть несколько более точных опций, которые вы могли бы использовать - посмотрите на sys/timex.h. Кроме того, для Boost Date.Time используется миллисекунда и более высокая точность таймеров.

Что касается «общего времени» физического истекшего времени, я видел это в многопоточном времени. Это просто «учетная запись»: все потребление «cpu» добавлено и может быть больше, чем прошедшее время в многопоточном коде, если все потоки работают, некоторые накладные расходы на планирование добавляются, и у вас было больше, чем истекшее время.

+0

интересно, однако тестовая программа, которую я использую, является однопоточной ... или так я думаю.я в настоящее время ссылаюсь только на unittest-cpp, поэтому, возможно, библиотека создает поток где-то – lurscher

+0

, используя getrusage. Теперь я получаю время процесса, которое последовательно ниже физического времени. Результат часов определенно выглядит странным. – lurscher

+0

Да, но на мульти- OS, некоторые другие вещи происходят и должны учитываться. Разве это не могло быть частью разницы между «вашим» временем и общим временем? –

2

Поле tv_usecstruct timeval находится в микросекундах, но не в единицах 1/(double)CLOCKS_PER_SEC.

+0

правый! по чистой случайности, локально мой CLOCKS_PER_SEC равнялся 10e6, поэтому результаты казались прекрасными – lurscher