我们有一个基于qthreads的工作流引擎,其中工作线程在放入队列时拾取输入的束,然后将其输出放在另一个队列上,以便其他工作线程运行下一个阶段;依此类推,直到消耗完所有输入并生成所有输出。
通常,多个线程将运行相同的任务,而其他线程将同时运行其他任务。我们希望对这些线程任务的性能进行基准测试,以便针对优化工作。
很容易获得运行给定任务的给定线程所花费的实际(已用)时间。我们只看一下在线程的run()过程的开始和结束时POSIX times()函数的返回值之间的差异。但是,我无法弄清楚如何获得相应的用户和系统时间。从传递给times()的struct tms
中获取这些内容不起作用,因为这个结构在所讨论的线程处于活动状态时提供所有线程的总用户和系统时间。
答案 0 :(得分:1)
假设这是在Linux上如何使用RUSAGE_THREAD进行getrusage()? Solaris也提供类似的RUSAGE_LWP,我猜它可能与其他类似POSIX的系统等效。
原油示例:
#define _GNU_SOURCE
#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>
#include <pthread.h>
#include <assert.h>
#include <unistd.h>
struct tinfo {
pthread_t thread;
int id;
struct rusage start;
struct rusage end;
};
static void *
thread_start(void *arg)
{
struct tinfo *inf = arg;
getrusage(RUSAGE_THREAD, &inf->start);
if (inf->id) {
sleep(10);
}
else {
const time_t start = time(NULL);
while (time(NULL) - start < 10); // Waste CPU time!
}
getrusage(RUSAGE_THREAD, &inf->end);
return 0;
}
int main() {
static const int nrthr = 2;
struct tinfo status[nrthr];
for (int i = 0; i < nrthr; ++i) {
status[i].id = i;
const int s = pthread_create(&status[i].thread,
NULL, &thread_start,
&status[i]);
assert(!s);
}
for (int i = 0; i < nrthr; ++i) {
const int s = pthread_join(status[i].thread, NULL);
assert(!s);
// Sub-second timing is available too
printf("Thread %d done: %ld (s) user, %ld (s) system\n", status[i].id,
status[i].end.ru_utime.tv_sec - status[i].start.ru_utime.tv_sec,
status[i].end.ru_stime.tv_sec - status[i].start.ru_stime.tv_sec);
}
}
我认为在使用GetProcessTimes()
的Windows上可能存在类似的情况