1

我需要实现一种可以测量 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 周期。

4

2 回答 2

3

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

于 2010-09-27T14:27:53.627 回答
1

您正在获得不同的时间,因为计算机性能变化很大。

于 2010-09-27T14:26:04.390 回答