Форум: "Начинающим";
Текущий архив: 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.053 c