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

Скорость работы процессора, точный таймер

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

Скорость работы процессора, точный таймер

Автор: ISV

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

Данная тема уже обсуждалась, но у меня есть своя реализация сабжа. Начиная с Pentium MMX, Intel ввели в процессор счетчик тактов на 64 бита (Присутствуэт точно и в К6). Для того чтобы посотреть на его содержание, была введена команда "rdtsc" (подробное описание в интеловской мануале). Эту возможность можно использовать для реализации сабжа. Посоку Делфя не вкурсе насчет rdtsc, то пришлось юзать опкод (0F31). Привожу простенький примерчик юзания, Вы уж извините - немножко кривоват получился, да и ошибка компалера какая-то вылезла :( (V4 Bld5.104 Upd 2). Кому интересно, поделитесь своими соображениями по этому поводу. Особенно интерисует работа в режиме когда меняется частота процессора (Duty Cycle, StandBy).

Проверялось под еНТями на Пне 2 333.


// (C) 1999 ISV
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
 Controls, Forms,Dialogs,  StdCtrls, Buttons, ExtCtrls;

type  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label4: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private    
{ Private declarations }
  public    
{ Public declarations }
    Counter:integer;
      //Счетчик срабатывания таймера    
Start:int64;              
//Начало роботы    
Previous:int64;        
//Предыдущее значение    
PStart,PStop:int64;
 //Для примера выч. времени   
 CurRate:integer;
     //Текущая частота проца    
function GetCPUClick:int64;    
function GetTime(Start,Stop:int64):double;
 end;
var  Form1: TForm1;implementation{$R *.DFM}
// Функция работает на пнях ММХ или выше а
// также проверялась на К6
function TForm1.GetCPUClick:int64;
begin
  asm    db  0fh,31h   
// Опкод для команды rdtsc
// mov dword ptr result,eax
// mov dword ptr result[4],edx
end;
// Не смешно :(. Без ?той штуки
// Компайлер выдает Internal error C1079  
Result:=Result;
end;
// Время в секундах между старт и стоп
function TForm1.GetTime(Start,Stop:int64):double;
begin
  try    result:=(Stop-Start)/CurRate  except    result:=0;
 end;
end;
// Обработчик таймера считает текущую частоту, выводит ее, а также
// усредненную частоту, текущий такт с момента старта процессора.
// При постоянной частоте процессора желательно интервал братьпобольше
// 1-5с для точного прощета частоты процессора.
procedure TForm1.Timer1Timer(Sender: TObject);
  var    i:int64;
begin
  i:=GetCPUClick;
  if Counter=0    then Start:=i    else 
begin
      Label2.Caption:=Format('Частота общая:%2f',
       [(i-Start)/(Counter*Timer1.Interval*1000)]);
      Label3.Caption:=Format('Частота текущая:%2f',
       [(i-Previous)/(Timer1.Interval*1000)]);
      CurRate:=Round(((i-Previous)*1000)/(Timer1.Interval));
    end;
  Label1.Cap примера
procedure TForm1.Button1Click(Sender: TObject);
begin
  PStart:=GetCPUClick;
end;
// Останавливаем отсчет времени и показуем соко
// прошло секунд
procedure TForm1.Button2Click(Sender: TObject);
begin
  PStop:=GetCPUClick;
  Label4.Caption:=Format!
('Время между нажатиями:%gсек',[GetTime(PStart,PStop)])
end;
end.

Это программный код на языке Delphi, который измеряет скорость процессора с помощью инструкции RDTSC (Read Time Stamp Counter), доступной на процессорах Pentium MMX и более поздних.

Вот разбивка кода:

  1. Функция GetCPUClick использует ассемблерный язык для выполнения инструкции RDTSC, которая читает текущее значение счетчика времени.
  2. Функция GetTime рассчитывает время, прошедшее между двумя заданными отметками времени (начало и конец), вычитая начальное значение из значения конца и делив результат на частоту процессора.
  3. В процедуре Timer1Timer, программа проверяет, является ли это первым шагом таймера (т.е., Counter = 0). Если так, она устанавливает начальное значение времени в текущее значение счетчика времени процессора. Иначе, она рассчитывает среднюю скорость процессора, вычитая предыдущее значение из текущего и делив результат на интервал таймера.
  4. Программа также отображает среднюю скорость процессора и текущую частоту процессора (в Гц) в двух метках (Label2 и Label3).
  5. В процедуре Button1Click, программа устанавливает начальное значение времени, когда кнопка нажата.
  6. В процедуре Button2Click, программа останавливает таймер, когда кнопка нажата, и рассчитывает время, прошедшее между начальным и конечным значениями времени с помощью функции GetTime.

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

  • Код использует ключевое слово asm для написания ассемблерного кода, который выполняет инструкцию RDTSC.
  • Функция GetCPUClick возвращает целочисленное значение, представляющее текущее значение счетчика времени процессора.
  • Функция GetTime возвращает вещественное двойное значение, представляющее время, прошедшее между двумя заданными отметками времени.
  • Программа использует свойство Timer1Interval для установки интервала таймера (в миллисекундах).
  • Программа предполагает, что частота процессора постоянна в течение периода измерения.

В целом, этот код предоставляет основное пример использования инструкции RDTSC и ассемблерных возможностей Delphi для измерения скорости процессора.

В статье описывается реализация сабжа на языке Delphi, используя команду 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:09:28/0.0063591003417969/0