在多核CPU的情况下,QueryPerformanceCounter函数可以正确地测量时间,但是需要注意以下几点:
在多线程编程中,每个线程应该有自己的计时器对象,避免不同线程之间的竞争和干扰。
在使用QueryPerformanceCounter函数时,应该先调用QueryPerformanceFrequency函数获取系统时钟周期的频率,并根据此频率将计数值转换为秒数。
下面是一个使用多线程和QueryPerformanceCounter函数来测量程序执行时间的例子:
#include <windows.h>
#include <vector>
#include <iostream>
using namespace std;
const int num_threads = 4;
const int num_iterations = 10000000;
double CounterToSeconds(LARGE_INTEGER counter)
{
static LARGE_INTEGER frequency;
if (frequency.QuadPart == 0)
QueryPerformanceFrequency(&frequency);
return (double)counter.QuadPart / (double)frequency.QuadPart;
}
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
LARGE_INTEGER start, end;
QueryPerformanceCounter(&start);
for (int i = 0; i < num_iterations; ++i) {}
QueryPerformanceCounter(&end);
double elapsed_time = CounterToSeconds(end - start);
cout << "Thread " << GetCurrentThreadId() << " elapsed time: " << elapsed_time << " seconds" << endl;
return 0;
}
int main()
{
HANDLE threads[num_threads];
for (int i = 0; i < num_threads; ++i)
threads[i] = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);
WaitForMultipleObjects(num_threads, threads, TRUE, INFINITE);
for (int i = 0; i < num_threads; ++i)
CloseHandle(threads[i]);
return 0;
}
在这个例子中,我们创建了4个线程,并让每个线程执行一定的空循环次数。在每个线程开始和结束时,都使用QueryPerformanceCounter函数获取当前时间戳,并将其转换为秒数。最后在主线程中等待所有子线程结束,并输出每个线程的耗时。