【问题标题】:Measure ContextSwitch Time C (Windows)测量 ContextSwitch 时间 C (Windows)
【发布时间】:2010-09-27 14:10:49
【问题描述】:

我需要实现一种方法,可以测量 Windows 中线程之间上下文切换的时间和 CPU 周期。

这是我的代码

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

LARGE_INTEGER initialTimeStamp, finalTimeStamp, freq;

DWORD ThreadProc(LPVOID lpdwThreadParam)
{
 SwitchToThread();
 return 0;
}

int main()
{
  int result;
  HANDLE hThread;
  QueryPerformanceFrequency(&freq);
  hThread = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)ThreadProc,NULL, 0, 0);

  QueryPerformanceCounter(&initialTimeStamp);
  SwitchToThread();
  QueryPerformanceCounter(&finalTimeStamp);

  result = (1000000 * ((finalTimeStamp.QuadPart - initialTimeStamp.QuadPart) / 2 ) / freq.QuadPart);
  printf("Windows Thread - context switch time is %u ns\n", result);  

  WaitForSingleObject(hThread, INFINITE);
  return 0;
}

注意:除以二,是因为我在 initialTimeStamp 和 finalTimeStamp 之间有两个上下文切换。

我不知道这是否是最好的或正确的方法...每次执行我得到不同的时间,这不是我所期望的。 我不确定如何获得 CPU 周期数。

【问题讨论】:

    标签: c windows multithreading context-switch


    【解决方案1】:

    您实际上必须有一个正在消耗 CPU 周期的线程才能让 SwitchToThread() 真正进行上下文切换。如果您的 CPU 有多个内核,则不止一个。即使那样,你得到的结果在很大程度上也毫无意义。开销的数量是高度可变的,具体取决于拥有获取量子的线程的进程和 TLB 缓存的状态。重新加载 TLB 寄存器并获取缓存未命中会增加大量时间。通常抛出的数字在 2,000 到 10,000 个周期之间。

    【讨论】:

    • 通过将 SwitchToThread() 替换为 Sleep(0) 会解决这个问题吗?一定有办法得到大概的时间。
    【解决方案2】:

    因为计算机的性能变化很大,所以你得到了不同的时间。

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 2013-03-21
      • 2016-06-15
      • 2012-10-20
      • 1970-01-01
      • 2011-08-04
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多