测试linux代码运行时间

发布时间 2023-09-20 22:09:30作者: 我就不告诉你我是谁

1. 前置知识

    (1)gettid 内核给线程(轻量级进程)分配的进程id,全局(所有进程中)唯一;
    (2)pthread_self()是在用户态实现的,获取的是相对于进程的线程控制块的首地址,只是在当前进程空间中是唯一的。不能保证同一进程先后多个线程具有不同的id。(当前一个线程结束其生命周期,进程又新创建了一个线程,那么该线程ID可能会使用消亡线程的ID)。

    (3)struct timespec

            {
                __time_t tv_sec; /* 秒数 long int */
               long tv_nsec; /* 纳秒数*/
            };

2. 代码

#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<sys/syscall.h>

/* 没有gettid函数,我们可以自己封装一下 */
pid_t gettid()
{
    return syscall(SYS_gettid);   
} 

/* 获取时间 */
static unsigned long long GetTickMs()
{
    unsigned long long nTimeV[2] = {0};
    struct timespec nTime;                  //linux中用的时间结构
    clock_gettime(CLOCK_MONOTONIC,&nTime);   //CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
    nTimeV[0] = nTime.tv_sec * 1000;        //转为ms
    nTimeV[1] = nTime.tv_nsec / 1000000;    //转为ms
    return (nTimeV[0] + nTimeV[1]);         //返回当前的时间是多少 ms
}

int main()
{
   unsigned long long nTimeVal[2] = {0};
   nTimeVal[0] = GetTickMs();

  for(int i = 0; i < 10000000; i++)
  {
  
  }

   nTimeVal[1] = GetTickMs();
   printf("Thread pid:%u, tid:%u, spend: %lldms \n", (unsigned int)getpid(), (unsigned int)gettid(), nTimeVal[1]- nTimeVal[0]);

   return 0;
}