Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Вниз

QueryPerformanceFrequency   Найти похожие ветки 

 
_Asph ©   (2007-06-29 13:10) [0]

QueryPerformanceFrequency(freq) на 1 компе возвращает значение на 3 порядка меньше, чем должно.
Такое впечатление, что там вместо ГГц - МГц.
Подскажите что может быть.
freq:int64;


 
Сергей М. ©   (2007-06-29 13:32) [1]


> что может быть


Вероятно вот это (цитата из соотв.ресурса msdn):

function retrieves the frequency of the high-resolution performance counter, if one exists
..
If the installed hardware does not support a high-resolution performance counter, this parameter can be zero

zero или не zero, но то самое installed hardware, если оно там действительно installed, думаю, вольно возвратить все что угодно, вплоть до сабжа.


 
Anatoly Podgoretsky ©   (2007-06-29 13:35) [2]

> _Asph  (29.06.2007 13:10:00)  [0]

Points to a variable that the function sets, in counts per second, to the current performance-counter frequency.
Ни о каких гигагерцах и речи нет.
Кроме того, что такое freq, как оно обрабатывается?


 
Сергей М. ©   (2007-06-29 13:39) [3]


> Anatoly Podgoretsky ©   (29.06.07 13:35) [2]


Точно.
Какие там нафих "герцы" !)
Результат в выдается (если выдается) в уругвайских попугаях, а автор этих попугаев почему-то в герцах решил мерить)


 
Jeer ©   (2007-06-29 13:41) [4]

QueryPerformanceFrequency возвращает частоту таймера 825Х - около
3.579545 MHz


 
Сергей М. ©   (2007-06-29 13:44) [5]


> Jeer ©   (29.06.07 13:41) [4]


А напомни, Серега, какого ?

Этих таймеров нонче - как собак нерезаных)...


 
Сергей М. ©   (2007-06-29 13:44) [6]


> 825Х


А, ну да, куда мои глаза глядят только)


 
Jeer ©   (2007-06-29 14:00) [7]

Сергей М. ©   (29.06.07 13:44) [5]

Когда-то был Intel8253 (580ВИ53), сейчас клоны

А вообще, есть очень неплохая статья об измерениях времени (профилирования) на x86 + win платформах
http://www.intel.com/cd/ids/developer/asmo-na/eng/209859.htm

Пожалуй это лучший метод, что я видел.
Во всяком случае удается уменьшить влияние технологий "размывания" (spread) спектра и "плавания" частоты CPU (speedstep)


 
_Asph ©   (2007-06-29 14:01) [8]


> QueryPerformanceFrequency возвращает частоту таймера 825Х
> - около
> 3.579545 MHz
>


На 2 компах freq выдает 3014520000 (примерно)
на 1  3514520 (примерно)
но порядок верный


 
Jeer ©   (2007-06-29 14:06) [9]

Проверено - мин нет.
У меня дает 3579545 Hz

// ******* Etimer.h

#include <windows.h>

#define CANNOT_GET_FREQUENCY      1
#define CANNOT_GET_START_TIME      2
#define CANNOT_GET_STOP_TIME      3
#define NO_PROCESSOR_AVAILABLE_TO_GET_START_TIME 4
#define NO_PROCESSOR_AVAILABLE_TO_GET_STOP_TIME  5
#define STOP_TIME_TAKEN_ON_DIFFERENT_PROCESSOR  6

struct Etime_type
{
double  Start,
   Stop,
   Frequency;

DWORD  ProcessorMask;

BOOL  AlreadyStart;

int   ErrorFlag;

};

typedef Etime_type Etime_t;

BOOL Etime(Etime_t *);

BOOL EtimeFrequency(Etime_t *);

BOOL EtimeInitialize(Etime_t *);

ULONGLONG EtimeDurationInTicks(Etime_t *);

double EtimeDurationInSeconds(Etime_t *);

// ********** Etimer.cpp

#include <stdio.h>
#include "Etimer.h"
#include <windows.h>
#include <math.h>
#include <conio.h>

BOOL EtimeInitialize(Etime_t *mtime)
{
mtime->Start     = 0;
mtime->Stop      = 0;
mtime->Frequency = 0;

mtime->ProcessorMask = 1;   // Lowest processor ID

mtime->AlreadyStart = FALSE;

mtime->ErrorFlag = 0;

if (EtimeFrequency(mtime))
 return TRUE;
else
 return FALSE;

}

BOOL Etime(Etime_t *mtime)
{

BOOL Status = TRUE;
LARGE_INTEGER Counter;

 HANDLE CurrentProcessHandle;
DWORD  ProcessAffinity;
DWORD  SystemAffinity;
DWORD  AllowProcessAffinity;
DWORD  AffinityMask;


//
CurrentProcessHandle = GetCurrentProcess();
GetProcessAffinityMask(CurrentProcessHandle, &ProcessAffinity, &SystemAffinity);

// Bit vector representing Processors that the thread can run on
AllowProcessAffinity = ProcessAffinity & SystemAffinity;

if (mtime->AlreadyStart) // Get STOP time
{

 // Make sure at least one processor is available for this thread
 if (AllowProcessAffinity)  
 {
  // Make sure running on the same processor that gets the START time
  if (mtime->ProcessorMask & AllowProcessAffinity)
   if (SetProcessAffinityMask(CurrentProcessHandle, mtime->ProcessorMask))
   {
    if (QueryPerformanceCounter(&Counter))
      mtime->Stop = (double) Counter.QuadPart;
    else
    {
     mtime->ErrorFlag = CANNOT_GET_STOP_TIME;
     Status = FALSE;
    }

   }
   else
   {
    mtime->ErrorFlag = NO_PROCESSOR_AVAILABLE_TO_GET_STOP_TIME;
    Status = FALSE;
   }
  else
  {
   mtime->ErrorFlag = STOP_TIME_TAKEN_ON_DIFFERENT_PROCESSOR;
   Status = FALSE;
  }
     
 }
 else
 {
  mtime->ErrorFlag = NO_PROCESSOR_AVAILABLE_TO_GET_STOP_TIME;
  Status = FALSE;
 }

}
else  
{
 
 // Make sure at least one processor is available for this thread
 if (AllowProcessAffinity)  
 {
  AffinityMask = 1;

  // Select the lowest processor ID to run
  while (AffinityMask <= AllowProcessAffinity)
  {
   // Check if this processor is available
   if (AffinityMask & AllowProcessAffinity)
   {
    if (SetProcessAffinityMask(CurrentProcessHandle, AffinityMask))
    {
     mtime->ProcessorMask = AffinityMask; // Save processor mask

     if (QueryPerformanceCounter(&Counter))
     {
      mtime->Start = (double) Counter.QuadPart;
      mtime->AlreadyStart = TRUE;     // Already got start time
     }
     else
     {
      mtime->ErrorFlag = CANNOT_GET_START_TIME;
      Status = FALSE;
     }

     break;
    }

   }

   AffinityMask = AffinityMask << 1;  // Check the next processor

  }

 }
 else
 {
  mtime->ErrorFlag = NO_PROCESSOR_AVAILABLE_TO_GET_START_TIME;
  Status = FALSE;
 }

}

// Reset the processor affinity
SetProcessAffinityMask(CurrentProcessHandle, ProcessAffinity);

return Status;
}

ULONGLONG EtimeDurationInTicks(Etime_t *mtime)
{

// In second

return (ULONGLONG) (mtime->Stop - mtime->Start);

}

double EtimeDurationInSeconds(Etime_t *mtime)
{

// In second

return (mtime->Stop - mtime->Start) / mtime->Frequency;

}

BOOL EtimeFrequency(Etime_t *mtime)
{
LARGE_INTEGER Freq;

if (QueryPerformanceFrequency(&Freq)) // Get the frequency of the timer
 mtime->Frequency = (double) Freq.QuadPart;
else
{
 mtime->ErrorFlag = CANNOT_GET_FREQUENCY;
 return FALSE;
}

return TRUE;
}

// ************ EtimerSample.cpp

#include <stdio.h>
#include "Etimer.h"
#include <windows.h>
#include <math.h>
#include <conio.h>

void main(void)
{

DWORD Interval = 1000;
DWORD i, j;

Etime_t mtime;

double x, y;
double pi = 3.14159;
x = pi / 2;
y = pi / 3;
double tmpArray[1000];

printf("Enhanced Timer\n");
printf("Version 1.0\n");
printf("(c) 2005 Intel Corporation\n");
printf("All Rights Reserved\n\n\n");

if (EtimeInitialize(&mtime))   // Initialize the structure and get the frequency timer

{
if (Etime(&mtime))  // 1st call to Etime to get the START time
{  

//*********************************************************************
// Put your code you want to measure here

 for (j=0; j < Interval; j++)
  for (i=0; i < Interval; i++)

   tmpArray[i] = sin(x)*sin(x) + cos(y)*cos(x) + tmpArray[i];

//**********************************************************************
 
 
 if (Etime(&mtime))  // 2nd call to Etime to get the STOP time
 {
  printf("Timer Frequency in:\n\n");
  printf("Hz  = %13.0f\n", mtime.Frequency);
  printf("MHz = %13.5f\n", mtime.Frequency/1000000.0);
  printf("GHz = %10.5f\n\n", mtime.Frequency/1.0e9);
  printf("Start Time = %16.0f Ticks\n",  mtime.Start);
  printf("Stop Time  = %16.0f Ticks\n\n",  mtime.Stop);
  printf("Duration in Ticks   =  %d\n",  EtimeDurationInTicks(&mtime));
  printf("Duration in seconds = %16.13f\n", EtimeDurationInSeconds(&mtime));
 }

}

}
switch(mtime.ErrorFlag)
{
 case CANNOT_GET_FREQUENCY:
  printf("Cannot get clock frequency\n");
  break;
 case CANNOT_GET_START_TIME:
  printf("Cannot get start time\n");
  break;
 case CANNOT_GET_STOP_TIME:
  printf("Cannot get stop time\n");
  break;
 case NO_PROCESSOR_AVAILABLE_TO_GET_START_TIME:
  printf("No processor available to get start time\n");
  break;
 case NO_PROCESSOR_AVAILABLE_TO_GET_STOP_TIME:
  printf("No processor available to get stop time\n");
  break;
 case STOP_TIME_TAKEN_ON_DIFFERENT_PROCESSOR:
  printf("Cannot specify processor\n");
  break;
}

printf("\nPress the Enter Key!\n");
getchar();

}


 
_Asph ©   (2007-06-29 14:18) [10]


> У меня дает 3579545 Hz

В том и суть что прямо сейчас смотрю, у меня выдает 3014520000
Т.е. частоту проца.
Да с поставленной задачей, по любому справляется.
Так как count из того же источника берется, просто степень дискредитации разная.
Тем не менее... интересно. От чего зависит.


 
homm ©   (2007-06-29 14:20) [11]

> В том и суть что прямо сейчас смотрю, у меня выдает 3014520000
> Т.е. частоту проца.

Ты что-то пцтаешь почитай справку. Она попугаи выдает.


 
_Asph ©   (2007-06-29 14:32) [12]


> QueryPerformanceFrequency возвращает частоту таймера 825Х
> - около
> 3.579545 MHz
>


> Ты что-то пцтаешь почитай справку. Она попугаи выдает.

Может это и попугаю. Но получаются они от оборудования.
В разных случаях от разного.
В 1 от таймера. в др от ??? Похоже на процессор.
Сейчас пройдусь по 10 ку компов, проведу эксперимент


 
homm ©   (2007-06-29 14:34) [13]

> Сейчас пройдусь по 10 ку компов, проведу эксперимент

Зачем получишь ответ: результат в попугаях! Какая цель исследования?


 
homm ©   (2007-06-29 14:34) [14]

> Зачем? Получишь ответ:

Вопросительный знак пропустил


 
_Asph ©   (2007-06-29 14:41) [15]

Да.... везде 3579545.
И только  у меня...
СПАСИБО!
Бум копать :)


 
Jeer ©   (2007-06-29 15:02) [16]


> _Asph ©   (29.06.07 14:18) [10]


var F: int64;
//
QueryPerformanceFrequency( F );
ShowMessage(IntToStr(F));

Вот это выдает у тебя  3014520000 ?

QPF не выдает частоту процессора и не выдавала.
Аналогично QPC выдает число тиков с момента reset
Обе эти функции привязаны к таймеру высокого разрешения (появился с 845 чипсета), который имеет частоту 3.5 MHz и находится в МС "южный мост"

GetTickCount привязана к PM-таймеру (системный таймер) и имеет разрешение,
зависящее от операционки.
Для win98 - 55 ms, для w2k - 10 ms
Проверить легко так:

// выдает результат в сотнях наносекунд
function GetDiscreet: Cardinal;
var  at, dt: Cardinal;
    b: LongBool;
begin
 GetSystemTimeAdjustment(at, dt, b);
 Result:= dt;
end;

Есть еще аппаратный счетчик тупо считающий такты процессора (периоды частоты CPU) с момента reset.
Считывается командой rdtsc


 
Sapersky   (2007-06-29 18:20) [17]

QPF не выдает частоту процессора и не выдавала.

Вот люди пишут, что может выдавать:

http://www.virtualdub.org/blog/pivot/entry.php?id=106
http://www.tcl.tk/cgi-bin/tct/tip/7.xml

Конечно, они могут и ошибаться. Но 3014520000 -  тоже ведь похоже на частоту CPU?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.041 c
11-1165692812
Trible
2006-12-09 22:33
2007.07.22
toolbar


2-1182958390
TruePunk
2007-06-27 19:33
2007.07.22
отображение файлов в листбоксе


2-1182842047
peter
2007-06-26 11:14
2007.07.22
Fast Report


2-1182676848
Victor456
2007-06-24 13:20
2007.07.22
Изменение формы окна


15-1181359354
MBo
2007-06-09 07:22
2007.07.22
Новый roadmap CodeGear





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский