2016-08-12 3 views
1

Вот вопрос низкого уровня. Как интенсивный процессор получает системное время?Насколько интенсивным становится время?

Что является источником времени? Я знаю, что на чипе BIOS есть аппаратные часы, но я думаю, что для получения данных из-за пределов процессора и ОЗУ потребуется какая-то аппаратная синхронизация, которая может задержать чтение, поэтому я предполагаю, что у процессора могут быть свои собственные часы. Не стесняйтесь исправить меня, если я ошибаюсь.

Получается ли время, вызванное тяжелым вызовом системной функции, или оно каким-либо образом зависит от используемого языка программирования?

+0

, так как время получения используется для профилирования до миллисекунд и даже разрешения наносекунд, я полагаю, что накладные расходы незначительны. – bolov

+0

Yup, накладные расходы мелочи. Здесь способ получения времени более или менее прослеживается: http://stackoverflow.com/a/38916054/357403 – Koshinae

ответ

2

Я просто проверял его с помощью программы 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(); 

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

+0

Если ваши измерения правильные, это 43,5 наносекунды на итерацию. Вы запускали с оптимизацией? – bolov

+0

@bolov: Я пробовал режим Release и Debug. Когда я напечатал счетчик итераций, оптимизатор не должен был есть цикл. Но вы правы, короткое время удивляет и может заслуживать дальнейшего анализа. –

+0

это не удивительно. Это не коротко. Что вы получили в выпуске и отладке? – bolov

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