boost chrono endTime — startTime возвращает отрицательный результат в boost 1.51

Библиотека Chrono Boost vs1,51 на моем MacBook Pro возвращает отрицательные времена, когда я вычитаю endTime — startTime. Если вы напечатаете временные точки, вы увидите, что время окончания раньше, чем время начала. Как это может случиться?

typedef boost::chrono::steady_clock clock_t;
clock_t clock;

// Start time measurement
boost::chrono::time_point<clock_t>  startTime = clock.now();
short test_times = 7;

// Spend some time...
for ( int i=0; i<test_times; ++i )
{
xnodeptr spResultDoc=parser.parse(inputSrc);

xstring sXmlResult = spResultDoc->str();
const char16_t* szDbg = sXmlResult.c_str();

BOOST_CHECK(spResultDoc->getNodeType()==xnode::DOCUMENT_NODE && sXmlResult == sXml);
}

// Stop time measurement
boost::chrono::time_point<clock_t> endTime = clock.now();
clock_t::duration elapsed( endTime - startTime);

std::cout << std::endl;
std::cout << "Now time: " << clock.now() << std::endl;
std::cout << "Start time: " << startTime << std::endl;
std::cout << "End time: " << endTime << std::endl;

std::cout << std::endl << "Total Parse time: " << elapsed << std::endl;
std::cout << "Avarage Parse time per iteration: " <<  (boost::chrono::duration_cast<boost::chrono::milliseconds>(elapsed) / test_times) << std::endl;

Я пробовал разные часы, но без разницы.

Любая помощь будет оценена!

РЕДАКТИРОВАТЬ: Забыл добавить вывод:

Сейчас время: 1 наносекунда с момента загрузки

Время начала: 140734799802912 наносекунд с момента загрузки

Время окончания: 140734799802480 наносекунд с момента загрузки

Общее время разбора: -432 наносекунд
Среднее время анализа на итерацию: 0 миллисекунд

3

Решение

Hyperthreading или просто планирование помех, Повысить реализацию поддерживает монотонную поддержку ОС:

POSIX: clock_gettime (CLOCK_MONOTONIC) хотя он все еще может потерпеть неудачу из-за ошибок ядра, обрабатывающих гиперпоточность при калибровке системы.

WIN32: QueryPerformanceCounter() которая ни на чем, кроме архитектуры Nehalem или новее, не будет монотонной для ядер и потоков.

OSX: mach_absolute_time()то есть устойчивый & часы с высоким разрешением одинаковы. исходный код показывает, что он использует RDTSC таким образом, строгая зависимость от аппаратной стабильности: то есть никаких гарантий.

Отключение гиперпоточности — рекомендуемый способ, но, скажем, в Windows вы действительно ограничены. Помимо снижения разрешения таймера, единственным доступным методом является прямой доступ к базовым аппаратным таймерам при одновременном обеспечении соответствия потоков.

Похоже, самое время отправить ошибку в Boost, я бы порекомендовал:

Win32: использовать GetTick64Count(), как обсуждалось Вот.

OSX: использовать clock_get_time (SYSTEM_CLOCK) в соответствии с этот вопрос.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]