как использовать chrono :: high_resolution_clock :: now () в темах

0

Я использую chrono::high_resolution_clock::now() в своей функции, чтобы время, в течение которого цикл занимает, чтобы получить расчетное время завершения для x количество повторов. Однако при вызове из основного с использованием future это дает время, которое просто неверно. Я использовал Visual C++ и компилятор intel c. Как это решить?

  • 4
    Вы должны будете опубликовать фактический код. Скорее всего, ваш тестовый код имеет некоторые проблемы.
Теги:
future

1 ответ

0
Лучший ответ

Это известная ошибка в VC и других, в заголовке используются системные часы, которые не очень высокого разрешения. Если вы хотите действительно точное время, используйте boost или rdtsc.

Используя boost, вы будете использовать его, как вы бы использовали std :: chrono, пример из ссылки:

 boost::chrono::high_resolution_clock::time_point t3 = boost::chrono::high_resolution_clock::now();
 boost::chrono::high_resolution_clock::time_point t4 = boost::chrono::high_resolution_clock::now();
 while (t3==t4 ) {
    t4 = boost::chrono::high_resolution_clock::now();
 }
 boost::chrono::nanoseconds ns = t4 - t3;

Возможная реализация rdtsc

// On some processors in certain circumstances the value can be off
// on some old processors rdtsc doesn't exist.
// only valid for x86/x64.
// only valid when no thread switch happens between calls.
// will be wrong if cpu uses turbo mode or changes speed.
// ToDO check where. make fallback timer.
// will blow up if you run over the epoch, shouldn't happen as the epoch is ~136 years
// beware of cpu instruction reordering if timing very short functions.
static uint64_t tick() noexcept {
    unsigned lo, hi;
    asm volatile("rdtsc" : "=a" (lo), "=d" (hi));
    return int64_t(hi) << 32 | lo;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню