Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 25 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 09.07.2008
Здравствуйте.
Пишу я тут маленькую прогу, которая определяет некоторую инфу о конфигурации компа (использую WMI). Кто-нибудь знает, как можно под Виндой определить частоту ЦП или памяти? WMI возвращает кривые значения частоты ЦП, частоту памяти вообще там не узнать. Я получаю правильную частоту системной шины, но не знаю множителя... Откуда вообще эта инфа берется тем же CPU-Z?
Заранее спасибо за советы.

P.S. За ссылку на форум, где есть шанс получить совет, тоже буду благодарен.


Последний раз редактировалось __alex8 05.11.2009 0:39, всего редактировалось 1 раз.


Партнер
 

Member
Статус: Не в сети
Регистрация: 30.03.2009
Откуда: Екатеринбург
я как то делал раньше щас непомню как.


 

Member
Статус: Не в сети
Регистрация: 09.09.2003
В книге Фень Юань "Графика в Windows" один из первых примеров. К сожалению под рукой книги нет, поэтому точнее сказать не могу. Но её легко найти в эл.виде.


Последний раз редактировалось D_A_R 02.11.2009 11:30, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 09.07.2008
Спасибо. Сейчас почитаю.


 

Member
Статус: Не в сети
Регистрация: 09.09.2003
__alex8
Наверно, не то я вам посоветовал. Он то подсчитывает её, а не получает.


 

Member
Статус: Не в сети
Регистрация: 09.07.2008
Хоть что-то...
Но как-то же это делается?


 

Member
Статус: Не в сети
Регистрация: 30.03.2009
Откуда: Екатеринбург
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     DWORD dwTimerHi, dwTimerLo;
    asm
     {
        DW 0x310F
        mov dwTimerLo, EAX
        mov dwTimerHi, EDX
      }
    Sleep (500);
    asm
     {
        DW 0x310F
        sub EAX, dwTimerLo
        sub EDX, dwTimerHi
        mov dwTimerLo, EAX
        mov dwTimerHi, EDX
     }
     Button1->Caption =dwTimerLo/(1000.0*500);

}
//---------------------------------------------------------------------------


 

Member
Статус: Не в сети
Регистрация: 09.07.2008
На этот код я натыкался. Он дает существенно заниженные результаты.
Мне кажется, что померять частоту в многозадачной ОС не получится.


 

Member
Статус: Не в сети
Регистрация: 30.03.2009
Откуда: Екатеринбург
код показывает правильно,он показывает с плавающей точкой просто,если округлить то нормальная частота получается
Замените Button1->Caption =dwTimerLo/(1000.0*500); на Button1->Caption =dwTimerLo/(1000*500);


 

Member
Статус: Не в сети
Регистрация: 09.07.2008
Да я ж не тупой. Мне все равно, целое там или с плавающей точкой. Значение существенно занижено (а именно - 1717 вместо 2400).


 

Member
Статус: Не в сети
Регистрация: 30.03.2009
Откуда: Екатеринбург
Может это энергосберегающий режим? попробуйте нагрузить процессор и запустить этот код.
У меня показывает точно

http://torrents.ru/forum/viewtopic.php?t=2374583
посмотрите на торренте мою раздачу,там через реестр получается частота


 

Member
Статус: Не в сети
Регистрация: 09.09.2003
__alex8 писал(а):
Да я ж не тупой. Мне все равно, целое там или с плавающей точкой. Значение существенно занижено (а именно - 1717 вместо 2400).

А если делать как у Фень Юаня, то правильно получается? У меня на core 2 quad 6600 правильно показывал.


 

Member
Статус: Не в сети
Регистрация: 09.07.2008
XTracer писал(а):
Может это энергосберегающий режим? попробуйте нагрузить процессор и запустить этот код.

Пробовал.

Добавлено спустя 1 минуту 46 секунд:
D_A_R писал(а):
А если делать как у Фень Юаня, то правильно получается? У меня на core 2 quad 6600 правильно показывал.

Пролистал книгу, не нашел такого примера. Сейчас снова читать буду.

Добавлено спустя 1 минуту 6 секунд:
__alex8 писал(а):
XTracer писал(а):
Может это энергосберегающий режим? попробуйте нагрузить процессор и запустить этот код.

Пробовал.
Через реестр будет то же, что и через WMI.

Добавлено спустя 1 минуту 46 секунд:
D_A_R писал(а):
А если делать как у Фень Юаня, то правильно получается? У меня на core 2 quad 6600 правильно показывал.

Пролистал книгу, не нашел такого примера. Сейчас снова читать буду.


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Ну да, кол-во тиков процессора через пару запросов RDTSC.
А вот время надо измерять. Например, через QueryPerformanceCounter / QueryPerformanceFrequency

И еще - попробуй поставить Sleep,1000 - результат тебя удивит. А лекарство - см. выше.


 

Member
Статус: Не в сети
Регистрация: 24.06.2008
serj писал(а):
И еще - попробуй поставить Sleep,1000 - результат тебя удивит

Чем больше спишь, тем точнее результат получается. Надо только не забывать верхние разряды использовать:

...
Button1->Caption =(dwTimerHi*(double)4294967296+dwTimerLo)/(1000.0*500);

И число, выделенное жирным, менять


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Any1, нет. Есть такое понятие, как гранулярность шедулера. 1000 на него делится без остатка, а 500 нет.


 

Member
Статус: Не в сети
Регистрация: 09.07.2008
serj писал(а):
QueryPerformanceFrequency

О!
Вот эта штука хоть как-то работает. Спасибо.
Всего 2.5 процента погрешность.


 

Member
Статус: Не в сети
Регистрация: 24.06.2008
serj писал(а):
Есть такое понятие, как гранулярность шедулера. 1000 на него делится без остатка, а 500 нет.

serj, разъясните, что за 'гранулярность шедулера' и почему учитывать надо именно ее, а не разрешение системного таймера.
Разрешение системного таймера на мультипроцессорной WinXP/2003 равно 7.8125ms, с этой стороны - что 500, что 1000 - без разницы


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Не помню точно, как там 7.8, а вот для мультипроцессорной системы эта цифра больше. Опять-же, не помню, порядка 26ms.


 

Member
Статус: Не в сети
Регистрация: 24.06.2008
serj писал(а):
Не помню точно, как там 7.8, а вот для мультипроцессорной системы эта цифра больше. Опять-же, не помню, порядка 26ms.

Про 7.8 написано, например, здесь http://technet.microsoft.com/en-us/sysi ... 63892.aspx
Цитата:
/TIMERES=
Sets the resolution of the system timer on the standard x86 multiprocessor HAL (Halmps.dll). The argument is a number interpreted in hundreds of nanoseconds, but the rate is set to the closest resolution the HAL supports that isn't larger than the one requested. The HAL supports the following resolutions: Hundreds of nanoseconds Milliseconds (ms) 9766 0.98 19532 2.00 39063 3.90 78125 7.80 The default resolution is 7.8 ms. The system timer resolution affects the resolution of waitable timers. Example: /TIMERES=21000 would set the timer to a resolution of 2.0 ms.

Есть опция в boot.ini чтобы менять разрешение системного таймера, но по дефолту оно = 1/128 sec ~ 7.8ms.

В некоторых других документах всплывает удвоенная величина 7.8125x2=15.6ms. Но это, по-видимому, связано со спецификой использования системного таймера прикладными программами


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 25 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan