Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/Linux中的线程执行时间_C_Linux_Multithreading_Linux Kernel_Pthreads - Fatal编程技术网

C/Linux中的线程执行时间

C/Linux中的线程执行时间,c,linux,multithreading,linux-kernel,pthreads,C,Linux,Multithreading,Linux Kernel,Pthreads,如果我能测量某个特定线程的实际时间或cpu周期,我会犹豫 pthreadcreate(.........); // // pthreadjoin(.......); 我用3个线程运行 一个主线程正在调用其余两个线程。 我想测量一个被调用线程的执行时间 我应该在linux环境中使用什么?您可以做一件事 在线程函数中,启动时使用printk生成日志。您可以使用it thread\t变量或thread index将其与不同的线程打印分开 在线程函数的末尾,放一个类似的日志 因此,在dmesg 将显示

如果我能测量某个特定线程的实际时间或cpu周期,我会犹豫

pthreadcreate(.........);
//
//
pthreadjoin(.......);
我用3个线程运行

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

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

您可以做一件事

在线程函数中,启动时使用printk生成日志。您可以使用it thread\t变量或thread index将其与不同的线程打印分开

在线程函数的末尾,放一个类似的日志

因此,在
dmesg

将显示带有时间戳的日志

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


我知道这不是一种更实用的方法,但只是为了调试的目的,您可以不费吹灰之力就完成这项工作

如果您想得到更准确的结果,可以使用勾号计数器:

#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 */
\ifndef定时
#定义定时
/*
*--具有timing_Init()的初始化计时库;
*--获取时间戳:
*勾选;
*打勾(t);
*--以微秒为单位获取两个时间戳之间的延迟:
*定时延迟(t1,t2);
*/
#包括
#包括
#包括
#ifndef min
#定义最小值(a,b)\
({{uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\
___uuu((b))u b=(b)的类型\
_a<\u b?\u a:\u b;})
#恩迪夫
typedef union u_tick
{
uint64_t勾选;
结构
{
uint32_t低;
uint32_t高;
}
附属的;
}勾选;
静态双刻度时间=0.0;
静态无符号长残差=0;
#如果已定义(uuu386_uuuuuuuuu124;)已定义(uuuPentium_uuuu124;)已定义(uuuuuu586_u124;)已定义(uuuuu686_u124;)已定义(uk6_u124;)已定义(uk6_124; u124;已定义(k7)124;已定义(uux86_64)
#定义GET_TICK(t)_asm____volatile(“rdtsc”):“=a”((t.sub.low)、“=d”((t.sub.high))
#否则
#错误“不支持的处理器”
#恩迪夫
#定义勾号原始差异(t1,t2)((t2).勾号-(t1).勾号)
#定义刻度差(t1,t2)(刻度差(t1,t2)-残差)
#定义定时延迟(t1,t2)tick2usec(TICK_DIFF(t1,t2))
无效时间_init(无效)
{
静态刻度t1,t2;
int i;

残差=(unsigned long long)1尝试了这个..?谢谢Hiren,正在寻找更优化的结果,以微秒为单位..在线程进入/退出时尝试
clock\u gettime(clock\u THREAD\u CPUTIME\u ID…)
(您可以为
pthread\u create
入口点使用包装函数,以避免更改多个线程函数。这是一个进程级度量。我认为它不会给出适当的清晰度。看起来很棒!!我已经使用了相同的方法。进一步寻找更好的方法/清晰度!!为什么在内核中使用printk?printkl空间。没有pthread。有kthread,这与pthread有很大不同。然后,dmesg可以工作。尝试收集thrad开始和结束时的时间可能会得到有用的结果。因为程序可能永远不会使用pthread_join(如果不需要)。我们通常需要与程序一样长的线程。@rr_ovi yea goo在这里捕获op需要的内核空间,因此没有pthread。