Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Для измерения задержек такого масштаба микросекундная точность уже недостаточна. Однако важна не только точность, но еще и накладные расходы на измерение времени. Линуксовый системный вызов clock_gettime() возвращает время с наносекундной точностью. На машине, которая вот прямо сейчас у меня под рукой (Intel® Xeon® CPU E5-2630 v2 @ 2.60GHz), этот вызов отрабатывает примерно за 120 нс. Очень неплохая цифра. К тому же clock_gettime() работает достаточно предсказуемо. Это позволяет учесть накладные расходы на его вызов и в действительности делать измерения с точностью порядка десятков наносекунд. Однако обратим теперь внимание вот на что. Чтобы измерить интервал времени, нужно сделать два таких вызова: в начале и в конце. Т.е. потратить 240 нс. Если измеряются плотно расположенные промежутки времени порядка 1-10мкс, то в некоторых таких случаях сам процесс измерения будет значительно искажать наблюдаемый процесс.
Мотивация примерно следующий — чтобы смотреть, как оптимизация какой нибудь одной строчки кода влияет на количество тактов процессора.
… аппаратура наряду со значением TSC может также предоставлять ID того CPU, на котором это значение прочитано (см. интеловскую инструкцию RDTSCP, «Intel 64 and IA-32 Architectures Software Developer's Manual», Volume 2)...

А что до инвариантности — либо TSC инвариантен в целом(CPUID.80000007H:EDX[8] == 1), либо ее нет в процессоре в принципе(SDM:Chapter:17.17.1).
А мне в голову еще один вариант пришел. Взять высокостабильный генератор, счетчик, возможно еще и МК. Правда, придется немного попаять.
Поскольку автор не указал под какие задачи он делал данное решение, но указал, использует его в виде секундомера, то вероятнее всего это измерение каких-то быстропротекающих процессов. Обычно такие процессы не нужно измерять каждый цикл, достаточно нескольких измерений для усреднения значения. Поэтому предложенное мной решение вполне подходит.
Использовать RDTSC я не стал из-за того, что на разных ядрах у него ТОЧНО разные значения и частота его инкрементации зависит от частоты процессора
Но она как-то решает проблему изменения частоты ядер?
Измерение времени с наносекундной точностью