这是一个多线程应用程序,在其中一个子线程中我写了下面的代码来计算线程运行函数的执行时间:
class CThreadObject{
public:
...
unsigned long GetTime(){
struct timeval val;
gettimeofday(&val, NULL);
return (val.tv_sec * 1000000 + val.tv_usec);
}
static void* Run(void *param){ // thread function
while (1){
static unsigned long ExecTime = GetTime();
unsigned long LastExecTime = 0;
if (TurnOnTest()){
LastExecTime = ExecTime;
ExecTime = GetTime();
mQueue.push_back(ExecTime - LastExecTime);
//std::deque<unsigned long> mQueue
}
//some other jobs such as
//I/O demultiplex and events dispatching
.......
};
return NULL;
}
void PrintStatistics(){
unsigned long tmp = 0;
while(mQueue.size()){
tmp += *mQueue.begin();
mQueue.pop_front();
}
printf("the total time is %lu\n", tmp);
}
private:
...
std::deque<unsigned long> mQueue;
pthread_t mThread;
};
应用程序只执行了 1 分钟,但我发现时间累积了 gQueue 的所有元素都是 175 秒,这比整个应用程序的时间要长。 为什么会这样?
[更新]
添加了一个功能 -- PrintStatistics()
最佳答案
您的线程没有测量它们的运行时间;他们正在(粗略地)测量开始时间和结束时间之间的差异。在那段时间里,它们并不是一直在运行;由于有多个线程(以及您机器上的多个进程),它们共享处理器时间,因此在开始和结束之间的间隔中有一些时间是空闲的。
想象一下:两个人在上午 9 点上类。他们轮流执行一些任务——例如驾驶叉车——然后继续关机,在执行任务和休息之间交替进行,直到下午 5 点,他们才下类打卡。他们总共记录了 16 个小时的工作,但是叉车只运行了 8 个小时,工作日(这里是程序的运行时间)也只有 8 个小时。您的程序正在测量时间 - 时间差。
关于c++ - 为什么一个子线程的执行时间比整个应用程序的执行时间多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287188/