我开发了一个用于多线程计算的类,一个线程只使用这个类的一个实例。另外,我想通过从另一个线程迭代这个类的容器来测量计算的持续时间。应用程序是win32。问题是,我读到QueryPerformanceCounter在比较单个线程上的度量时是很有用的。因为我的问题是不能使用它,所以我想到了clock()或GetSystemTime()。令人遗憾的是,这两种方法的“分辨率”都是毫秒(因为win32上的CLOCKS_PER_SEC是1000 )。我应该使用哪种方法或推广哪种方法,有更好的选择吗?通常,我必须在工作线程之外进行测量。下面是一些示例代码。
unsinged long GetCounter()
{
SYSTEMTIME ww;
GetSystemTime(&ww);
return ww.wMilliseconds + 1000 * ww.wSeconds;
// or
return clock();
}
class WorkClass
{
bool is_working;
unsigned long counter;
HANDLE threadHandle;
public:
DoWork()
{
threadHandle = GetCurrentThread();
is_working = true;
counter = GetCounter();
// Do some work
is_working = false;
}
};
void CheckDurations() // will work on another thread;
{
for(size_t i =0;i < vector_of_workClass.size(); ++i)
{
WorkClass & wc = vector_of_workClass[i];
if(wc.is_working)
{
unsigned long dur = GetCounter() - wc.counter;
ReportDuration(wc,dur);
if( dur > someLimitValue)
TerminateThread(wc.threadHandle);
}
}
}发布于 2010-12-22 18:37:50
QueryPerformanceCounter适用于多线程应用程序。在不同的处理器上调用时,可能使用的处理器指令(rdtsc)可能会提供无效的结果。
我推荐阅读"Game Timing and Multicore Processors"。
对于您的特定应用程序,您试图解决的问题似乎是在一些潜在的长时间运行的线程上使用超时。正确的解决方案是使用带有超时值的WaitForMultipleObjects函数。如果时间到期,那么您可以终止任何仍在运行的线程-理想情况下,可以通过设置每个线程检查的标志来终止,但TerminateThread可能是合适的。
发布于 2010-12-22 18:38:11
这两种方法的精度都是毫秒
他们没有。他们有一毫秒的分辨率,精度要差得多。大多数机器仅以15.625毫秒的间隔递增该值。这是大量的CPU周期,通常不足以获得任何可靠的代码效率指标。
QPF做得更好,不知道为什么你不能使用它。分析器是衡量代码效率的标准工具。胜过获取你不想要的依赖项。
发布于 2010-12-22 19:56:47
QueryPerformanceCounter应该可以提供最好的精度,但是当函数在不同的处理器上运行时会出现问题(每个处理器都会得到不同的结果)。因此,当在线程中运行时,当线程切换处理器时,您会遇到移位。要解决这个问题,可以为测量时间的线程设置处理器亲和性。
https://stackoverflow.com/questions/4508114
复制相似问题