Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как определить скорость процессора 2

Delphi , ОС и Железо , Процессор

Как определить скорость процессора 2


program ....;
..
..


const
  ID_BIT = $200000; // EFLAGS ID bit

function GetCPUSpeed: Double;
const
  DelayTime = 500;
var
  TimerHi, TimerLo: DWORD;
  PriorityClass, Priority: Integer;
begin
  try
    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);

    Result := TimerLo / (1000.0 * DelayTime);
  except
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  cpuspeed: string;
begin
  cpuspeed := Format('%f MHz', [GetCPUSpeed]);
  edit1.text := cpuspeed;
end;

Это программное обеспечение на языке Delphi, которое измеряет скорость процессора в МГц с помощью инструкции RDTSC (Read Time Stamp Counter), которая читает регистр счётчика времени процессора.

Следующий шаг:

  1. Функция GetCPUSpeed устанавливает приоритет текущего потока на "реальный" и затем спит 10 миллисекунд.
  2. Затем она использует inline-ассемблер для чтения регистра счётчика времени (RDTSC) два раза, с задержкой в 500 миллисекунд между ними. Это даёт нам два таймстампа: TimerLo и TimerHi.
  3. Функция вычитывает первый таймстамп из второго для получения истекающего времени.
  4. Затем она конвертирует истекающее время в МГц, делая его на задержку (500 миллисекунд) и умножая на 1000 (поскольку есть 1000 микросекунд в миллисекунде).
  5. Результат возвращается в виде вещественного числа.

Событийный обработчик кнопки Button1Click вызывает функцию GetCPUSpeed и отображает результат в строковом формате ("x.y МГц") в контроле редактирования (edit1.text).

Некоторые примечания:

  • Это программное обеспечение предполагает, что процессор поддерживает RDTSC. Некоторые более старые процессоры могут не поддерживать эту инструкцию.
  • Аккуратность измерения зависит от различных факторов, таких как точность регистра счётчика времени и тайминг задержек.
  • Вы можете изменить время задержки (DelayTime) для торговли между точностью измерения и скоростью выполнения.

Альтернативное решение с более современным подходом:

function GetCPUSpeed: Double;
const
  DelayTime = 1000000; // микросекунд
var
  StartTime, EndTime: Int64;
begin
  StartTime := TStopwatch.GetTickCount;
  Sleep(DelayTime);
  EndTime := TStopwatch.GetTickCount;

  Result := (EndTime - StartTime) / 1000.0 * 1000000.0; // конвертируем в МГц
end;

В этом коде используется класс TStopwatch из модуля System.Diagnostics, который предоставляет более точный и удобный способ измерения интервалов времени. Остальная часть кода остается аналогичной.

В статье описывается способ определения скорости процессора на языке Delphi с использованием инструкции rdtsc и расчета времени выполнения операции Sleep.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессор ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 03:41:01/0.005856990814209/0