Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1

Получить текущую тактовую частоту процессора

19.10.2013, 21:52. Показов 5865. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В Интернете я нашёл данный код, задался целью понять, как он работает. Для этого изучил WinAPI функции, которые здесь имеются, и закомментировал то, что они делают. Но всё равно есть несколько вопросов:
1. Зачем нам нужно менять приоритет приложения?
2. Зачем нужна задержка в 10 и 500 мс?
3. Какую работу выполняют данные инструкции на Асме?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function TForm1.getCPUSpeed: string;
const
  DelayTime = 500;
var
  TimerHi, TimerLo: dword;
  PriorityClass, Priority: integer; // значения приоритетов процесса
  Speed: double;
begin
   // меняем приоритет текущего процесса
   PriorityClass := GetPriorityClass(GetCurrentProcess); // получаем значение класса приоритета
   Priority := GetThreadPriority( GetCurrentThread ); // получаем значение приоритета
   SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); // задаем самый высокий класс приоритета
   SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); // уровень базового приоритета = 31
 
   Sleep(10); // задержка на 10 мс
 
   asm
      dw  310Fh
      mov TimerLo, eax
      mov TimerHi, edx
   end;
 
   Sleep(DelayTime); // задержка на 500 мс
 
   asm
      dw  310Fh
      sub eax, TimerLo
      sbb edx, TimerHi
      mov TimerLo, eax
      mov TimerHi, edx
   end;
 
   // восстанавливаем приоритет тек. процесса для первоначального процесса
   SetThreadPriority(GetCurrentThread, Priority); // ставим значение приоритета
   SetPriorityClass(GetCurrentProcess, PriorityClass); // ставим класс приоритета
 
   Speed := TimerLo / (1000.0 * DelayTime);
   Result := Format('%f MHz', [Speed]);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(getCPUSpeed);
end;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.10.2013, 21:52
Ответы с готовыми решениями:

Turbo Pascal!? Как возвратить тактовую частоту процессора?
надеюсь это вообще осуществимо, может через Assembler как-то?

Как выставить тактовую частоту процессора в atmel studio 7.0?
Доброго времени суток. Кто знает как выставить тактовую частоту процессора в atmel studio 7.0. Жду ваших предложений.

Как поднять базовую тактовую частоту процессора AMD Athlon M320?
Не могу разогнать процессор, нашел только как изменить множитель а он и так на максимуме. Сейчас тактовая частота процессора при множителе...

14
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
19.10.2013, 22:03
Ерунда это все какая-то.
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button2Click(Sender: TObject);
var
  Frequency: Int64;
begin
  if QueryPerformanceFrequency(Frequency) then
    ShowMessage(IntToStr(Frequency));
end;
1
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
19.10.2013, 23:01  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Ерунда это все какая-то.
Только вот у нас совсем разные цели, мне нужна текущая частота (а она должна меняться непрерывно), а у вас всегда одинаковый результат выводится.
Да и ошибка где-то есть: у вашего кода выводит 2485,957, а у моего 2542,30.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
19.10.2013, 23:25
QueryPerformanceFrequency возвращает текущую частоту процессора.
И почему ты решил, что частота должна "плавать"?
0
Заблокирован
20.10.2013, 03:04
FIL,
Вот именно. частота плавает. Она не стабильна.
Зачем менять приоритет? А затем. Виндоус система многозадачная. И каждому приложению или процессу отводится доля времени для работы. И это может при подсчёте дать неверные данные. Вот поэтому устанавливается исключительный приоритет. Но устанавливается на короткое время, иначе может произойти крах системы.
Первая задержка нужна, чтобы всё "устаканилось" То есть перед измерением нужно дать время для стабилизации приоритета. И тоже самое перед снятием приоритета, и ещё чтобы полученные данные успели "зафиксироватся" поскольку подсчёт идёт на лету. Ну инерция. знаете что такое инерция? Вот и за время задержки идёт погашение инерции. не забывайте. что речь идёт об очень больших частотах. Правда тут нету задержки для перед возвращением приоритета, хотя лучше бы была. Но это как говорится. входит в зону риска...
А та задержка, что 500, это время подсчёта. Первый блок на ассемблере снимает текущие показания таймера. Второй блок снимает показания после задержки. За это время набегает куча тиков. Вот эта куча - разность между этими данными. Она вычисляется во втором блоке. Чем больше эта задержка, тем точнее подсчёт, но больше опасность краха. Иногда её рискуют поставить в 1000.

А плавает частота по очень простой причине. Кварц намного ниже по частоте. И для создания реальной тактовой частоты используют умножители частоты. Вот они дают некую флукацию (шум). Но это нисколько не отражается на расчётах, поскольку все точные подсчёты привязаны к кварцевому генератору. В СВЧ технике это неизбежно. Если даже мегагерцовая телевизионная частота гуляет, то чего вы хотите от гигагерц?
2
angstrom
20.10.2013, 03:56
Я иак понимаю, код взят отсюда. Они там много копий сломали.
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
20.10.2013, 12:03
Частота - штука загадочная.
Например, у меня утилиты, показывающие частоту работы ядер в реальном времени (CPU-Z и т.п.), во время простоя выдают 1.6ГГц, под нагрузкой она возрастает до 3.7ГГц, при этом меняется только множитель.
А приведенный тут код выдает все время одно и тоже +-1кГц. Видимо тупо берет частоту шины и множит на 35 (как и QueryPerformanceFrequency, впрочем).
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
20.10.2013, 20:14  [ТС]
В ходе тестирования было обнаружено, что стандартная API функция QueryPerformanceFrequency работает некорректно: возвращает одно и тоже число всегда, к тому же оно и не соответствует реальному значению (погрешность 60 мГц).

Приведенный мною код работает правильно: т.к. частота "плавает", то и значения всегда разные, кроме того, они довольно точные, погрешность не превышает максимум 1 мГц (в сравнении с CPU-Z). А при увеличении DelayTime и ещё меньше.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
20.10.2013, 20:18
Craw, а у тебя множитель частоты в CPU-Z меняется?
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
20.10.2013, 20:56  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
а у тебя множитель частоты в CPU-Z меняется?
Нет, он у меня постоянный - 19. А как это должно влиять?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
20.10.2013, 21:42
Цитата Сообщение от Craw Посмотреть сообщение
А как это должно влиять?
У меня он меняется от 16 до 39 и, соответственно, частота - от 1.6ГГц до 3.9ГГц, а код выдает всегда один и тотже результат ~3.5ГГц. Т.е. он не учитывает изменение множителя и, следовательно, выдает некорректный результат на современных процессорах.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
20.10.2013, 22:29  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
не учитывает изменение множителя

Тогда какие изменения следует внести, чтобы учитывать множитель? Есть идеи?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
20.10.2013, 23:09
Цитата Сообщение от Craw Посмотреть сообщение
Есть идеи?
Нет. Везде этот код приводится.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.10.2013, 23:23
Цитата Сообщение от Craw Посмотреть сообщение
1. Зачем нам нужно менять приоритет приложения?
2. Зачем нужна задержка в 10 и 500 мс?
Автор кода пытался таким нехитрым способом влиять на переключение контекстов,
чтобы снизить его влияние на процесс измерения частоты CPU к минимуму.
На самом деле, все эти потуги с приоритетами и задержками примерно в равной
степени как уточняют результат вычислений, так и искажают его (ибо все равно
остаются прерывания, переключения контекстов, paging и прочие побочные эффекты,
влияние которых нельзя полностью исключить).

Цитата Сообщение от Craw Посмотреть сообщение
3. Какую работу выполняют данные инструкции на Асме?
Работа с инструкцией RDTSC.
Это известный способ измерения рабочей частоты процессора.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
21.10.2013, 20:30  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Везде этот код приводится.
Может есть иные способы узнать частоту ЦП?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2013, 20:30
Помогаю со студенческими работами здесь

Как поменять тактовую частоту?
Как поменять тактовую частоту не убив бутлоадер? Есть программатор AVRISP mkII

Влияние АЦП на тактовую частоту МК
Добрый день! Сделал термоконтроллер на amega88pa -- контроллер, таймер, часы для духовки. В процессе отладки столкнулся с тем, что...

Процессор перестал повышать тактовую частоту
Так вот господа процессор перестал разгоняться при нагрузке(да и вообще он даже при включение пк держит частоту 2400 хотя начальная...

Получить текущую температуру процессора
Доброго времени суток, пытаюсь написать скрипт который выдает текущую температуру процессора, но он выдает ошибку подскажите, пожалуйста,...

Нужно понизить тактовую частоту POWER и CHASSIS вентеляторов
проблема такова, хочю понизить тактовую частоту POWER и CHASSIS вентеляторов, не знаю как Q-fan регулирует тоько основной вентелятор на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru