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

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

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

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


Hа боpтy самолёта: "Здpавствyйте, дамы и господа, говоpит командиp экипажа. Мы благодаpим вас за то, что вы выбpали нашy авиакомпанию для пеpвого полёта в пеpвый день нового 2000 года. Мы находимся на высоте 3 тыс. фyтов, наша скоpость... ваy!... ох мля!... вот фак!... Извините за те неyдобства, котоpые вы испытываете, находясь вниз головой, надеюсь все были пpистёгнyты. Есть ли сpеди пассажиpов на боpтy пpогpаммист?"


function GetCPUSpeed: real;

function IsCPUID_Available: Boolean; assembler; register;
asm
  PUSHFD { прямой доступ к флагам невозможен, только через стек }
  POP EAX { флаги в EAX }
  MOV EDX,EAX { сохраняем текущие флаги }
  xor EAX,$200000 { бит ID не нужен }
  PUSH EAX { в стек }
  POPFD { из стека в флаги, без бита ID }
  PUSHFD { возвращаем в стек }
  POP EAX { обратно в EAX }
  xor EAX,EDX { проверяем, появился ли бит ID }
  JZ @exit { нет, CPUID не доступен }
  MOV AL,True { Result=True }
  @exit:
end;

function hasTSC: Boolean;
var
  Features: Longword;
begin
  asm
    MOV Features,0 { Features = 0 }

    PUSH EBX
    xor EAX,EAX
    DW $A20F
    POP EBX

    CMP EAX,$01
    JL @Fail

    xor EAX,EAX
    MOV EAX,$01
    PUSH EBX
    DW $A20F
    MOV Features,EDX
    POP EBX
    @Fail:
  end;

  hasTSC := (Features and $10) <> 0;
end;

const
  DELAY = 500;
var
  TimerHi, TimerLo: Integer;
  PriorityClass, Priority: Integer;
begin
  Result := 0;
  if not (IsCPUID_Available and hasTSC) then
    Exit;
  PriorityClass := GetPriorityClass(GetCurrentProcess);
  Priority := GetThreadPriority(GetCurrentThread);

  SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread,
  THREAD_PRIORITY_TIME_CRITICAL);

  SleepEx(10, FALSE);

  asm
    DB $0F { $0F31 op-code for RDTSC Pentium инструкции }
    DB $31 { возвращает 64-битное целое (Integer) }
    MOV TimerLo,EAX
    MOV TimerHi,EDX
  end;

  SleepEx(DELAY, FALSE);

  asm
    DB $0F { $0F31 op-code для RDTSC Pentium инструкции }
    DB $31 { возвращает 64-битное целое (Integer) }
    SUB EAX,TimerLo
    SBB EDX,TimerHi
    MOV TimerLo,EAX
    MOV TimerHi,EDX
  end;

  SetThreadPriority(GetCurrentThread, Priority);
  SetPriorityClass(GetCurrentProcess, PriorityClass);
  Result := TimerLo / (1000 * DELAY);
end;

Для определения скорости процессора с помощью этого кода необходимо понять, что он делает и как.

Код написан на языке Delphi и использует ассемблерный язык для взаимодействия с CPU. Он состоит из нескольких функций:

  1. GetCPUSpeed: Функция проверяет, поддерживает ли CPU инструкцию CPUID, и возвращает булевое значение, указывающее ее доступность.
  2. IsCPUID_Available: Функция проверяет, доступна ли инструкция CPUID, пытаясь выполнить ее и затем проверять, был ли установлен бит ID в регистре EFLAGS.
  3. hasTSC: Функция проверяет, доступен ли TSC (Time Stamp Counter), который является функцией, позволяющей измерять интервалы времени.

Основная функция, GetCPUFrequency, использует эти функции для определения частоты CPU:

  1. Она проверяет, доступны ли инструкция CPUID и TSC.
  2. Если они доступны, она устанавливает приоритет потока в реальный приоритет с помощью SetPriorityClass и SetThreadPriority.
  3. Затем она выполняет задержку на 10 миллисекунд с помощью SleepEx.
  4. Далее она использует инструкцию RDTSC (Read Time Stamp Counter) для чтения значения TSC в этом моменте.
  5. Код затем ожидает заданную задержку (500 миллисекунд в этом случае).
  6. После задержки он читает значение TSC снова с помощью RDTSC.
  7. Результатом является вычитание первого значения TSC из второго, что позволяет рассчитать разницу времени между двумя чтениями.
  8. Наконец, она конвертирует эту разницу времени в частоту, делая ее на заданную задержку (500 миллисекунд) и умножая на 1000 (чтобы преобразовать из миллисекунд в секунды).

Результатом является оценка частоты CPU в МГц.

Обратите внимание, что этот код предполагает процессор Pentium или более поздний, так как RDTSC не доступен на старых процессорах. Кроме того, точность измерения может варьироваться в зависимости от различных факторов, таких как загрузка системы и другие процессы, работающие одновременно.

Определение скорости процессора: для этого используются функции IsCPUID_Available и hasTSC, а также операция RDTSC, которая измеряет количество тактов процессора.


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

Получайте свежие новости и обновления по 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:11:50/0.0078728199005127/1