ну и поясню
метод основывается на расчете количества секунд (изначально) в одном такте
так как это число будет дробным то домножим его на 2^32
отсюда получаем 1 (более общий случай) и 2 (для одного такта) формулу
Код:
tacts=(1<<32)*time (1)
tact - tsc
time - length of tacts
1 tact = (1<<32) * time_per_tact (2)
с другой стороны, время одного такта вычисляется так (3)
Код:
time_per_tact = 1 sec / frequency (3)
обьединив (2) и (3) получим (4)
Код:
1 tact = (1<<32) * 1 sec / frequency (4)
то есть результатом (4) будет константа для перехода от количества тактов к времени, которая расчитывается заранее исходя из частоты процессора. дальнейшие формулы привязываются только к расчету частоты (я считал количество тактов за 50 мс и умножал его на 20 для получения частоты)
в программе эта константа называется factor.
время у меня расчитывается в микросекундах (отсюда значение 50000, тк 50 мс = 50000 мкс)
при умножении количества тактов (32 разрядная величина) на фактор времени мы получим 64 разрядное число в старших 32 разрядах которого будет храниться количество микросекунд.
Для увеличения точности, остаток (то есть младшие 32 разряда) сохраняются и при последующих вычислениях используется для корекции
таким методом можно расчитывать временные интервалы длинной до 1 с, так как на 4 ГГц проце разница показаний счетчика тактов, при разнице более чем в 1 секунду, не влезть в 32 разрядное число. (хотя при такой частоте фактор будет очень маленькой величиной, то есть если взять разницу показаний счетчика тактов как 64 разрядную величину, то умножение на фактор не даст переполнения)