0

一个简单的问题:

哪个是 QueryPerformanceFrequency 单位?Hz(每秒滴答声)?

非常感谢,布鲁诺

4

1 回答 1

3

问:QueryPerformanceFrequency 的单位?

A:千赫兹(不是赫兹)

=========== 详情 ======================================= ========

我的研究表明 Counters 和 Freq 都以 KILO、KILO-clock-ticks 和 KILO-HERTZ 为单位!

计数器记录 KILO-Clicks (KLICKS),频率要么以 kHz 为单位,要么我被严重的 UnderClocked。当您将 Clock_Ticks 除以 Clock_Frequency 时,k clicks/(k clicks*sec^-1),除秒外,一切都消失了。

这是一个仅包含基本要素的示例 C 程序:

#include "stdio.h"
#include <windows.h>   // Needed for LARGE_INTEGER

// gcc cpu.freq.test.c -o cft.exe
// cft.exe -> Sleep d_KLICKS=3417790, d_time=0.999182880 sec, CPU_Freq=3420585 KILO-Hz

void main(int argc, char *argv[])  {
    // Clock KILO-ticks start, end, CPU_Freq in kHz. KILOs cancel
    LARGE_INTEGER sklick, eklick, cpu_khz;  
    double delta_time;  // Expected time in SECONDS. All units above are k.

    QueryPerformanceFrequency(&cpu_khz);  // Gets clock KILO-tics, Klicks/sec
    QueryPerformanceCounter(&sklick);     // Capture cpu Start Klicks
    Sleep(1000);                          // Sleep 1000 MILLI-seconds
    QueryPerformanceCounter(&eklick);     // Capture cpu End   Klicks
    delta_time = (eklick.QuadPart-sklick.QuadPart) / (double)cpu_khz.QuadPart;
    printf("Sleep d_KLICKS=%lld, d_time=%4.9lf sec, CPU_Freq=%lld KILO-Hz\n", 
        eklick.QuadPart-sklick.QuadPart, delta_time, cpu_khz.QuadPart);  
}

它实际上编译!跑步...

Sleep d_KLICKS=3418803, d_time=0.999479036 sec, CPU_Freq=3420585 KILO-Hz

CPU 频率读取 3420585 或 3.420585E6 或 3.4 M-Hertz?<- 超级伤害!哎哟!

实际 CPU 频率为 3.4 Mega-Kilo-Hz 或 3.4 GHz

微软似乎很困惑(有些事情永远不会改变): https ://msdn.microsoft.com/en-us/library/windows/desktop/dn553408%28v=vs.85%29.aspx

QueryPerformanceFrequency(&Frequency); 
QueryPerformanceCounter(&StartingTime);
    // Activity to be timed
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
// We now have the elapsed number of ticks, along with the
// number of ticks-per-second.

1 秒内“经过的滴答声”的数量是百万,而不是十亿,所以它们不是 UNIT-CPU-CLOCK-TICKS 而是 KILO-CPU-CLOCK-TICKS

FREQ 的同样偏离 3 个数量级的误差:340 万不是“每秒滴答声”,而是每秒千个滴答声。

只要您将一个除以另一个,吗?点击会在几秒钟内取消并产生结果。如果有人愚蠢到在他们的文档中使用 ms 并尝试在其他计算中使用他们的“每秒滴答数”,那么您最终会以 1000 或 ~1 标准_ms_error 的因子结束!

也许我们应该叫海因里希来检查他的单位?哎呀!153 年太晚了。:(

于 2015-06-10T19:57:39.943 回答