特定のスレッドの実際の時間または CPU ティックを測定できるかどうかをさまよいます。
pthreadcreate(.........);
//
//
pthreadjoin(.......);
私は3つのスレッドで実行しています。
1 つのマスター スレッドが残りの 2 つのスレッドを呼び出しています。呼び出されたスレッドの実行時間を測定したい。
Linux 環境では何を使用すればよいですか?
特定のスレッドの実際の時間または CPU ティックを測定できるかどうかをさまよいます。
pthreadcreate(.........);
//
//
pthreadjoin(.......);
私は3つのスレッドで実行しています。
1 つのマスター スレッドが残りの 2 つのスレッドを呼び出しています。呼び出されたスレッドの実行時間を測定したい。
Linux 環境では何を使用すればよいですか?
より正確な結果が必要な場合は、ティック カウンターを使用できます。
#ifndef TIMING_H
#define TIMING_H
/*
* -- Init timing library with timing_init();
* -- get timestamp :
* tick_t t;
* GET_TICK(t);
* -- get delay between two timestamps in microseconds :
* TIMING_DELAY(t1, t2);
*/
#include <sys/time.h>
#include <unistd.h>
#include <stdint.h>
#ifndef min
#define min(a,b) \
({__typeof__ ((a)) _a = (a); \
__typeof__ ((b)) _b = (b); \
_a < _b ? _a : _b; })
#endif
typedef union u_tick
{
uint64_t tick;
struct
{
uint32_t low;
uint32_t high;
}
sub;
} tick_t;
static double scale_time = 0.0;
static unsigned long long residual = 0;
#if defined(__i386__) || defined(__pentium__) || defined(__pentiumpro__) || defined(__i586__) || defined(__i686__) || defined(__k6__) || defined(__k7__) || defined(__x86_64__)
# define GET_TICK(t) __asm__ volatile("rdtsc" : "=a" ((t).sub.low), "=d" ((t).sub.high))
#else
# error "Unsupported processor"
#endif
#define TICK_RAW_DIFF(t1, t2) ((t2).tick - (t1).tick)
#define TICK_DIFF(t1, t2) (TICK_RAW_DIFF(t1, t2) - residual)
#define TIMING_DELAY(t1, t2) tick2usec(TICK_DIFF(t1, t2))
void timing_init(void)
{
static tick_t t1, t2;
int i;
residual = (unsigned long long)1 << 63;
for(i = 0; i < 20; i++)
{
GET_TICK(t1);
GET_TICK(t2);
residual = min(residual, TICK_RAW_DIFF(t1, t2));
}
{
struct timeval tv1,tv2;
GET_TICK(t1);
gettimeofday(&tv1,0);
usleep(500000);
GET_TICK(t2);
gettimeofday(&tv2,0);
scale_time = ((tv2.tv_sec*1e6 + tv2.tv_usec) -
(tv1.tv_sec*1e6 + tv1.tv_usec)) /
(double)(TICK_DIFF(t1, t2));
}
}
double tick2usec(long long t)
{
return (double)(t)*scale_time;
}
#endif /* TIMING_H */
あなたは一つのことをすることができます
起動時のスレッド関数では、printk を使用してログを作成します。thread_t変数またはスレッドインデックスを使用して、別のスレッド印刷で分離できます
そのスレッド関数の最後に、そのような別のログを置きます。
だからdmesg
ログを表示しますtimestamp
そのため、ログの終了時刻とログの開始時刻を区別できます。
これがこれを行うより実用的な方法ではないことはわかっていますが、デバッグ目的のためだけに、それほど労力をかけずにこれを行うことができます。