Новейший российский микропроцессор имеет не только повышенное быстродействие и уменьшенное энергопотребление, но и четыре удобные ручки для его переноски грузчиками, и улучшенную систему охлаждения, легко подключаемую к обычному водопроводному крану.
Данная тема уже обсуждалась, но у меня есть своя реализация сабжа. Начиная с Pentium MMX,
Intel ввели в процессор счетчик тактов на 64 бита (Присутствуэт точно и в К6). Для того чтобы посотреть
на его содержание, была введена команда "rdtsc" (подробное описание в интеловской мануале).
Эту возможность можно использовать для реализации сабжа.
Посоку Делфя не вкурсе насчет rdtsc, то пришлось юзать опкод (0F31).
Привожу простенький примерчик юзания, Вы уж извините - немножко кривоват получился,
да и ошибка компалера какая-то вылезла :( (V4 Bld5.104 Upd 2). Кому интересно, поделитесь своими
соображениями по этому поводу. Особенно интерисует работа в режиме когда меняется частота
процессора (Duty Cycle, StandBy).
Проверялось под еНТями на Пне 2 333.
// (C) 1999 ISVunit Unit1;
interfaceuses
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}// Функция работает на пнях ММХ или выше а// также проверялась на К6function TForm1.GetCPUClick:int64;
beginasm db 0fh,31h
// Опкод для команды rdtsc// mov dword ptr result,eax// mov dword ptr result[4],edxend;
// Не смешно :(. Без ?той штуки// Компайлер выдает Internal error C1079
Result:=Result;
end;
// Время в секундах между старт и стопfunction TForm1.GetTime(Start,Stop:int64):double;
begintry 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 elsebegin
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 и более поздних.
Вот разбивка кода:
Функция GetCPUClick использует ассемблерный язык для выполнения инструкции RDTSC, которая читает текущее значение счетчика времени.
Функция GetTime рассчитывает время, прошедшее между двумя заданными отметками времени (начало и конец), вычитая начальное значение из значения конца и делив результат на частоту процессора.
В процедуре Timer1Timer, программа проверяет, является ли это первым шагом таймера (т.е., Counter = 0). Если так, она устанавливает начальное значение времени в текущее значение счетчика времени процессора. Иначе, она рассчитывает среднюю скорость процессора, вычитая предыдущее значение из текущего и делив результат на интервал таймера.
Программа также отображает среднюю скорость процессора и текущую частоту процессора (в Гц) в двух метках (Label2 и Label3).
В процедуре Button1Click, программа устанавливает начальное значение времени, когда кнопка нажата.
В процедуре Button2Click, программа останавливает таймер, когда кнопка нажата, и рассчитывает время, прошедшее между начальным и конечным значениями времени с помощью функции GetTime.
Некоторые примечания:
Код использует ключевое слово asm для написания ассемблерного кода, который выполняет инструкцию RDTSC.
Функция GetCPUClick возвращает целочисленное значение, представляющее текущее значение счетчика времени процессора.
Функция GetTime возвращает вещественное двойное значение, представляющее время, прошедшее между двумя заданными отметками времени.
Программа использует свойство Timer1Interval для установки интервала таймера (в миллисекундах).
Программа предполагает, что частота процессора постоянна в течение периода измерения.
В целом, этот код предоставляет основное пример использования инструкции RDTSC и ассемблерных возможностей Delphi для измерения скорости процессора.
В статье описывается реализация сабжа на языке Delphi, используя команду rdtsc для измерения скорости работы процессора и таймера.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.