2012-05-16 1 views
1
struct timeval start, end, duration; 
gettimeofday(&start, NULL); 

res = curl_easy_perform(curl); 

gettimeofday(&end, NULL); 
timersub(&end, &start, &duration); 

tm* startTime = localtime(&start.tv_sec); 
tm* endTime = localtime(&end.tv_sec); 
char buf[64]; 
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", startTime); 
char buf2[64]; 
strftime(buf2, sizeof(buf2), "%Y-%m-%d %H:%M:%S", endTime); 

ofstream timeFile; 
timeFile.open ("timingSheet.txt"); 
timeFile << fixed << showpoint; 
timeFile << setprecision(6); 
timeFile << "Duration: " << duration.tv_sec << "." << duration.tv_usec << " seconds \n"; 
timeFile << "Start time: " << buf <<"." << start.tv_usec << "\n"; 
timeFile << "End time: " << buf2 <<"." << end.tv_usec << "\n"; 
timeFile.close(); 

Когда я запускаю этот код я получаю этот выход:несовпадения по времени

Duration: 3.462243 seconds 
Start time: 2012-05-15 17:14:07.432613 
End time: 2012-05-15 17:14:07.894856 

Что озадачивает меня в том, что значение длительности не совпадает с временем начала и окончания. Две даты отличаются только микросекундами. Для этого есть причина?

Спасибо!

+0

Что происходит в 'timersub()'? –

+0

timersub() не должен влиять ни на начало, ни на конец. Это просто функция для получения разницы в два временных интервала и размещения этих значений в длительности. – Dave

+0

Пожалуйста, введите код. Если он не изменяет 'start' или' end', он должен неправильно вычислять 'duration'. –

ответ

2

localtime возвращает статически выделенный буфер, и вы вызываете его дважды, поэтому StartTime и EndTime одинаковы. Вам нужно скопировать его в другой буфер сразу после каждого вызова.

tm* startTime = localtime(&start.tv_sec); 
char buf[64]; 
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", startTime); 

tm* endTime = localtime(&end.tv_sec); 
char buf2[64]; 
strftime(buf2, sizeof(buf2), "%Y-%m-%d %H:%M:%S", endTime); 

EDIT: Вы также можете написать это:

tm* pTimeBuf = localtime(&start.tv_sec); 
char buf[64]; 
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", pTimeBuf); 

localtime(&end.tv_sec); // NB. I don't store th return value (since I have it already) 
char buf2[64]; 
strftime(buf2, sizeof(buf2), "%Y-%m-%d %H:%M:%S", pTimeBuf); 
+0

Хмм, где я могу получить дополнительную информацию о работе strftime? – Dave

+0

проблема не в strftime(), это с localtime(). localtime возвращает указатель на внутреннюю часть памяти. Эта память используется повторно при каждом вызове в localtime. ваши переменные starttime en endtime имеют одинаковое значение указателя, на самом деле вы можете избавиться от одного (я обновлю свой ответ, чтобы вы могли видеть, что я имею в виду). –

+0

более безопасный и, несомненно, лучший вариант localtime() - это тот, на который указывает ответ AwesomeNix. –

2

Я согласен с Эдвином здесь, только незначительные изменения, что его лучше использовать нить безопасную версию localtime_r вместо МестноеВремя

struct tm startTime,endTime; 
memset(&startTime,0,sizeof(struct tm)); //Advisable but not necessary 
memset(&endTime,0,sizeof(struct tm)); //Advisable but not necessary 
localtime_r(&start.tv_sec, &startTime); 
localtime_r(&end.tv_sec, &endTime); 

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

  • Нет связанных вопросов^_^