2010-08-03 44 views
3

我們有一個基於qthreads的工作流引擎,工作線程在放入隊列時選取輸入包,然後將其輸出放在另一個隊列上供其他工作線程運行下個階段;依此類推,直到所有輸入已被消耗並且所有輸出已經產生。確定線程使用的用戶和系統時間

通常,多個線程將運行相同的任務,其他線程將同時運行其他任務。我們希望對這些線程化任務的性能進行基準測試,以便優化目標。

很容易獲得給定線程運行給定任務所花費的實際(經過)時間。我們只看一下線程運行()過程開始和結束時POSIX times()函數的返回值之間的區別。但是,我無法弄清楚如何獲得相應的用戶和系統時間。從傳遞給times()的struct tms獲取這些內容不起作用,因爲此結構給出所有正在討論的線程處於活動狀態的所有線程的總用戶和系統時間。

+0

我會認爲你想獲得一個分析器來爲你做這個。 – 2010-08-13 17:28:37

回答

1

假設這是在Linux上如何getrusage()與RUSAGE_THREAD? 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類似的東西有可能在窗口()