Я просто проверял его с помощью программы C++
:
clock_t started = clock();
clock_t endClock = started + CLOCKS_PER_SEC;
long itera = 0;
for (; clock() < endClock; itera++)
{
}
Я получаю около 23000000 итераций в секунду (Windows 7, 32bit, Visual Studio 2015, 2,6 ГГц CPU). Что касается вашего вопроса, я бы не назвал это интенсивным. В режиме отладки я измерил 18 миллионов итераций в секунду.
В случае, когда время преобразуется в локализованную временную метку, сложные вычисления календаря (часовой пояс, летнее время, ...) могут значительно замедлить цикл.
Непросто рассказать, что происходит внутри звонка clock()
. Для моей системы он вызывает QueryPerfomanceCounter
, но это повторяется к другим системным функциям, как описано here.
Tuning
Чтобы уменьшить накладные расходы измерения времени еще больше, вы можете измерить в каждой 10-й, 100-й ... итерации.
следующие меры один раз в 1024 итераций:
for (; (itera & 0x03FF) || (clock() < endClock); itera++)
{
}
Это вызывает цикл в секунду подсчета некоторые 500 миллионов людей.
Настройка с помощью таймера Темы
Следующие дает дальнейшее улучшение примерно на 10%, оплаченное с дополнительной сложностью:
std::atomic<bool> processing = true;
// launch a timer thread to clear the processing flag after 1s
std::thread t([&processing]() {
std::this_thread::sleep_for(std::chrono::seconds(1));
processing = false;
});
for (; (itera & 0x03FF) || processing; itera++)
{
}
t.join();
запускается Дополнительный поток, который спит в течение одной секунды и затем задает управляющую переменную. Основной поток выполняет цикл, пока нити таймера не сигнализируют о завершении обработки.
, так как время получения используется для профилирования до миллисекунд и даже разрешения наносекунд, я полагаю, что накладные расходы незначительны. – bolov
Yup, накладные расходы мелочи. Здесь способ получения времени более или менее прослеживается: http://stackoverflow.com/a/38916054/357403 – Koshinae