1

如果我可以测量特定线程所占用的实际时间或 cpu 滴答声,我会徘徊。

pthreadcreate(.........);
//
//
pthreadjoin(.......);

我正在运行 3 个线程。

一个主线程正在调用其余两个线程。我想测量被调用线程的执行时间。

我应该在linux环境中使用什么?

4

2 回答 2

0

你可以做一件事

在启动时的线程函数中使用 printk 创建日志。您可以使用它 thread_t 变量或线程索引将其与不同的线程打印分开

并在该线程函数的末尾放置另一个类似的日志。

所以在dmesg

将显示日志timestamp

因此您可以区分结束日志时间和开始日志时间。

我知道这不是更实用的方法,但只是为了调试目的,你可以毫不费力地做到这一点。

于 2013-04-10T09:36:43.070 回答
0

如果您想获得更准确的结果,可以使用刻度计数器:

#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 */
于 2013-04-10T16:34:52.080 回答