![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение частоты процессора [D7, NT4]
Woolen © (2003-10-23 11:36:00)
Не понимаю, как софверно можно более или менее точно определить частоту процессора. Я, так понимаю, изобрел велосипед и все уже давно решено гораздо более изящно, но, блин, не знаю, как. Обычно, чужие алгоритмы получают погрешность на 1 - 2 МГц, а у меня разброс на Celeron 2 ГГц: 1976 - 2005 МГц. Это же невозможно кому-то показывать! Делаю так:
1) считываю текущее значение - rdtsc
2) запускаю мультимедийный (для точности) таймер - у обычного погрешность 0.05 секунды
3) сбрасываю будеву переменную
4) запускаю бесконечный цикл, пока переменная не будет выставлена - выставляется в обработчике таймера
5) считываю второй раз rdtsc
6) вычитаю заначения, делю на 1000000 (чтоб мегагерцы получить) и возвращаю как результат функции
Вопрос: Скажите, кто знает, плз, почему такой большой разброс (ведь мультимедийный - по идее - самый точный таймер в системе), и как получить более точное значение, чтоб не было разброса в 30 МГц, а был хотя бы в 5?
Woolen (2003-10-23 13:55:00) [1]
> 1) считываю текущее значение - rdtsc
> 2) запускаю мультимедийный (для точности) таймер - у обычного
> погрешность 0.05 секунды
> 3) сбрасываю будеву переменную
>
> Ты в измерения добавил еще и 2/3, надо 2, 3, 1
>
> Ну и конечно приоритеты.
Спасибо
Anatoly Podgoretsky (2003-10-23 13:23:00) [2]
1) считываю текущее значение - rdtsc
2) запускаю мультимедийный (для точности) таймер - у обычного погрешность 0.05 секунды
3) сбрасываю будеву переменную
Ты в измерения добавил еще и 2/3, надо 2, 3, 1
Ну и конечно приоритеты.
Woolen (2003-10-23 13:15:00) [3]
> HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
>
> ~MHz
>
> Но это тока в НТ
погрешность такая же, как и измерение вышеуказанным способом, но измерение в 95, 98, Me должно еще работать, так что выбираю в пользу измерения. Спасибо большое всем, кто откликнулся
clickmaker (2003-10-23 12:52:00) [4]
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
~MHz
Но это тока в НТ
Vlad Oshin (2003-10-23 12:46:00) [5]
> В реестре она написана, частота
да тут еще рядом много чего полезного лежит! Спасибо.
> Woolen (23.10.03 12:30) [3]
ProcessorNameString ищи или подобное
Woolen (2003-10-23 12:30:00) [6]
> В реестре она написана, частота
А поточнее можно? Спасибо
Игорь Шевченко (2003-10-23 11:52:00) [7]
В реестре она написана, частота
Vlad Oshin (2003-10-23 11:40:00) [8]
www.podgoretsky.com, Asm и Delphi
const
DelayTime = 500; // measure time in ms
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: Integer;
s:string;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
s:= Format("CPU speed: %f MHz", [TimerLo / (1000.0 * DelayTime)]);
Label1.Caption :=s;