windows中的QueryPerformance计数器和QueryPerformance频率 #包括 #包括 #包括 //假设我们以微秒分辨率返回时间 #根据1定义秒表滴答声 uint64获取秒表() { 大整数t,freq; uint64_t val; 查询性能计数器(&t); QueryPerformanceFrequency(&freq); 返回(uint64_t)(t.QuadPart/(double)freq.QuadPart*1000000); } 无效任务() { printf(“hi\n”); } int main() { uint64_t start=GetStopWatch(); 任务(); uint64_t stop=GetStopWatch(); printf(“运行时间(微秒):%lld\n”,停止-启动); }

windows中的QueryPerformance计数器和QueryPerformance频率 #包括 #包括 #包括 //假设我们以微秒分辨率返回时间 #根据1定义秒表滴答声 uint64获取秒表() { 大整数t,freq; uint64_t val; 查询性能计数器(&t); QueryPerformanceFrequency(&freq); 返回(uint64_t)(t.QuadPart/(double)freq.QuadPart*1000000); } 无效任务() { printf(“hi\n”); } int main() { uint64_t start=GetStopWatch(); 任务(); uint64_t stop=GetStopWatch(); printf(“运行时间(微秒):%lld\n”,停止-启动); },c,windows,timer,task,performancecounter,C,Windows,Timer,Task,Performancecounter,上面包含一个查询性能计数器函数,用于检索高分辨率性能计数器的当前值,而查询性能频率函数用于检索高分辨率性能计数器的频率。如果我调用任务();函数多次,则开始时间和停止时间之间的差异会有所不同,但多次调用任务函数应该会得到相同的时间差异。有人能帮我找出上面代码中的错误吗 问题是,Windows是一种先发制人的多任务操作系统。你问这到底是什么意思 “简单”-windows将时间片分配给系统中每个正在运行的进程。这就产生了数十个或数百个进程并行运行的错觉。实际上,在一台典型的台式机/笔记本电脑中,您只

上面包含一个查询性能计数器函数,用于检索高分辨率性能计数器的当前值,而查询性能频率函数用于检索高分辨率性能计数器的频率。如果我调用任务();函数多次,则开始时间和停止时间之间的差异会有所不同,但多次调用任务函数应该会得到相同的时间差异。有人能帮我找出上面代码中的错误吗

问题是,Windows是一种先发制人的多任务操作系统。你问这到底是什么意思

“简单”-windows将时间片分配给系统中每个正在运行的进程。这就产生了数十个或数百个进程并行运行的错觉。实际上,在一台典型的台式机/笔记本电脑中,您只能使用2、4、8或16个并行进程。英特尔i3有2个物理内核,每个内核都能给人一种同时做两件事的感觉。(但实际上,有一些硬件技巧可以在两个线程之间切换执行,每个内核可以同时处理这些线程)这是Windows/Linux/MacOSX所做的软件上下文切换之外的

这些时间片不保证每次的持续时间相同。您可能会发现电脑与windows进行同步。要更新时钟,您可能会发现病毒扫描程序决定开始工作,或者其他任何事情。所有这些事件都可能发生在task()函数开始之后,但在它结束之前

在DOS时代,每次对task()的单个迭代进行计时时,都会得到几乎相同的结果。不过,多亏了TSR程序,您仍然可以发现在执行过程中触发了一个中断,并偷走了一些机器时间

正是由于这些原因,可以通过运行任务N次,将经过的时间除以N来获得每次迭代的时间,从而更准确地确定任务执行所需的时间

对于过去的一些函数,我使用的N值高达1亿

编辑:一个简短的片段

#include <windows.h>
#include <stdio.h>
#include <stdint.h>

// assuming we return times with microsecond resolution
#define STOPWATCH_TICKS_PER_US  1

uint64_t GetStopWatch()
{
    LARGE_INTEGER t, freq;
    uint64_t val;

    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&freq);
    return (uint64_t) (t.QuadPart / (double) freq.QuadPart * 1000000);
}

void task()
{
    printf("hi\n");
}

int main()
{
  uint64_t start = GetStopWatch();
  task();
  uint64_t stop = GetStopWatch();

  printf("Elapsed time (microseconds): %lld\n", stop - start);
}
大整数t开始,趋向;
大整数tFreq;
双TSECS;
QueryPerformanceFrequency(&tFreq);
QueryPerformanceCounter(&tStart);
int i,n=100;

对于(i=0;i现代操作系统和处理器上的代码执行时间是非常不可预测的。在任何情况下,您都不能确定实际经过的时间测量了代码所用的时间,您的程序在执行时很可能已将处理器丢失给另一个进程。处理器使用的缓存起着很大的作用,当缓存还没有包含程序使用的代码和数据时,代码在第一次执行时总是慢得多。与处理器相比,内存总线非常慢

当您测量printf()时,它变得特别没有意义语句。控制台窗口由另一个进程拥有,因此有很大一部分进程互操作开销,其执行时间主要取决于该进程的状态。例如,当需要滚动控制台窗口时,您会突然看到巨大的差异。最重要的是,实际上您无法对t使它更快,所以测量它只是出于好奇


只分析您可以改进的代码。采集大量样本以消除异常值。永远不要选择最低的度量值,这只会产生不切实际的期望。也不要选择平均值,这会受到其他进程在您的测试中可能产生的长时间延迟的影响。中值是一个不错的选择。

这不是甚至你的代码。代码是由Ale提供的。Ale给了我上面的代码,并试图用我的应用程序进行修改,但我多次调用任务函数所用的时间有所不同。你能帮我修改上面的代码吗?是的,我刚刚做了。我告诉过你需要做什么,所以去做吧。复制/粘贴编码器被殴打和排斥,而不是填鸭式的!如果你仍然太懒,我会给你这个。把对task()的调用放在一个有N次迭代的for循环中。完成后,用
iterationTime=(stopTime startTime)/N;
(是的,我心情不好,很抱歉,这就是你问无聊的问题而没有感谢的结果!)非常感谢!!!我知道如何在上面的代码中多次调用任务函数。我的问题:我多次调用任务函数,每次都只是打印hi(上面的代码中没有显示).为什么每次都显示不同的运行时间?不客气。我真的看不到你的屏幕,你知道,这有点难以推测…我确实想知道你的数学运算顺序是否导致溢出。我现在太累了,无法进行桌面检查。但我提供了一些我使用的代码,在或1亿次迭代(即n=100000000)。您会在我的原始解决方案中找到代码,我已经更新了。:#包括“TIMER1.h”#包括“MAIN.h”typedef unsigned int uint16;uint16\t count;/***此任务每2ms激活一次。*/void TASK1(){大整数开始、停止、频率;双时间长度;QueryPerformanceFrequency(&freq)查询
LARGE_INTEGER tStart, tEnd;
LARGE_INTEGER tFreq;
double tSecsElapsed;
QueryPerformanceFrequency(&tFreq);
QueryPerformanceCounter(&tStart);

int i, n = 100;
for (i=0; i<n; i++)
{
// Do Something
}

QueryPerformanceCounter(&tEnd);
tSecsElapsed = (tEnd.QuadPart - tStart.QuadPart) / (double)tFreq.QuadPart;
double tMsElapsed = tSecElapsed * 1000;

double tMsPerIteration = tMsElapsed / (double)n;