Как определить частоту процессора
Модераторы: Duncon, Hawk, Romeo, Eugie
Здраствуйте!
Собственно нужно определить частоту процессора в одной программе.
Кто нибудь знает как это сделать (какие Api-функции или как-то по другому) ?
(На Vb или С++)
И еще какие спробы можно применить для контроля использования приложением процессора?
Собственно нужно определить частоту процессора в одной программе.
Кто нибудь знает как это сделать (какие Api-функции или как-то по другому) ?
(На Vb или С++)
И еще какие спробы можно применить для контроля использования приложением процессора?
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Оно сохраняется в реестре.
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~MHz
Плюс, есть еще WinApi функция с очень контринтуитивным названием GetSystemInfo.
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~MHz
Плюс, есть еще WinApi функция с очень контринтуитивным названием GetSystemInfo.
2B OR NOT(2B) = FF
Мне нужно чтобы программа занимала только определенное количество процессорного времени - например только 50%. Как мне кажется, с помощью таймера и функции Sleep.Absurd писал(а):Профайлер?
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Это зависит от специфики того что ты пишешь. В общем случае для таких вещей используют операционные системы реального времени (RTOS). Win32 к ним не относится. Но и в Win32 есть определенные фичи - например WM_IDLE и низкие приоритеты у треда. Приложение консольное/оконное ?MDCI писал(а):Мне нужно чтобы программа занимала только определенное количество процессорного времени - например только 50%. Как мне кажется, с помощью таймера и функции Sleep.
2B OR NOT(2B) = FF
Еще вариант замерить число тактов процеесора в секунду (частоту). Замерить число тактов выполнения основного алгоритма, а остальное число тактов: TranslateMessage, DispatchMessage.
It's a long way to the top if you wanna rock'n'roll
Парни, я не силен в 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.
Так и пиши - RDTSC - дельфи поймет, только вот на AMD такой инстукции кажеться нет." писал(а):dw 310Fh
Не забывай про TimerHi - за полсекунды процессор выполнит громадное число инструкции, так что это не 100% рабочий код, но 96-97% это точно
It's a long way to the top if you wanna rock'n'roll