Страница 1 из 1
Как определить частоту процессора
Добавлено: 21 дек 2006, 12:31
MDCI
Здраствуйте!
Собственно нужно определить частоту процессора в одной программе.
Кто нибудь знает как это сделать (какие Api-функции или как-то по другому) ?
(На Vb или С++)
И еще какие спробы можно применить для контроля использования приложением процессора?
Re: Как определить частоту процессора
Добавлено: 21 дек 2006, 17:00
Absurd
Оно сохраняется в реестре.
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~MHz
Плюс, есть еще WinApi функция с очень контринтуитивным названием GetSystemInfo.
Re: Как определить частоту процессора
Добавлено: 21 дек 2006, 17:01
Absurd
mdci писал(а):И еще какие спробы можно применить для контроля использования приложением процессора?
Профайлер?
Re: Как определить частоту процессора
Добавлено: 21 дек 2006, 17:12
MDCI
Absurd писал(а):Профайлер?
Мне нужно чтобы программа занимала только определенное количество процессорного времени - например только 50%. Как мне кажется, с помощью таймера и функции Sleep.
Re: Как определить частоту процессора
Добавлено: 21 дек 2006, 17:50
Absurd
MDCI писал(а):Мне нужно чтобы программа занимала только определенное количество процессорного времени - например только 50%. Как мне кажется, с помощью таймера и функции Sleep.
Это зависит от специфики того что ты пишешь. В общем случае для таких вещей используют операционные системы реального времени (RTOS). Win32 к ним не относится. Но и в Win32 есть определенные фичи - например WM_IDLE и низкие приоритеты у треда. Приложение консольное/оконное ?
Re: Как определить частоту процессора
Добавлено: 22 дек 2006, 12:01
somewhere
Еще вариант замерить число тактов процеесора в секунду (частоту). Замерить число тактов выполнения основного алгоритма, а остальное число тактов: TranslateMessage, DispatchMessage.
Как определить частоту процессора
Добавлено: 28 дек 2006, 23:12
Gambler
Парни, я не силен в C++ но могу предложить 100% рабочий код на Delphi...
Держите:
Код: Выделить всё
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
stop : boolean;
implementation
uses Unit2;
{$R *.dfm}
function GetCPUSpeed: Double;
const
DelayTime = 500;
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo/(1000.0 * DelayTime);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
Button2.Enabled := True;
Button2.Default:=true;
label1.Visible:=true;
Stop := False;
while not Stop do
begin
Label1.Caption := 'Скорость='+FloatToStr(GetCPUSpeed)+' MHz';
Application.ProcessMessages;
end;
Button1.Enabled := True;
Button2.Enabled := False;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Stop:=true;
end;
end.
Re: Как определить частоту процессора
Добавлено: 29 дек 2006, 08:33
somewhere
" писал(а):dw 310Fh
Так и пиши - RDTSC - дельфи поймет, только вот на AMD такой инстукции кажеться нет.
Не забывай про TimerHi - за полсекунды процессор выполнит громадное число инструкции, так что это не 100% рабочий код, но 96-97% это точно