linux__时间__操作

sno_guo的博客,用来记录平时用到的一些小函数.不断更新中........
unsigned int get_current_time()
{
     time_t timep;
     struct tm *p;
     int year;
     time(&timep);

     p=localtime(&timep); 
     year=(int)(p->tm_year-100);
     if(year<0)
     	   year=0;
      return   ((year<<26) 
                | ((unsigned int)((1+p->tm_mon)&0xf)<<22)
                | ((unsigned int)((p->tm_mday)&0x1f)<<17)
                | ((unsigned int)((p->tm_hour)&0x1f)<<12)
                | ((unsigned int)((p->tm_min)&0x3f)<<6)
                | ((p->tm_sec)&0x3f));
	/* unsigned int returntime = get_current_time();  这里仅仅是测试代码
         printf("return time is 0x%x\n",returntime);                      
       int second,minute,hour,day,month,year;
       second = returntime & 0x3f;
	     minute = (returntime >> 6) & 0x3f;
	     hour = (returntime >> 12) & 0x1f;
	     day = (returntime >> 17) & 0x1f;
	     month = (returntime >> 22) & 0xf;
	     year = 2000 + (returntime >> 26);
	
   printf ("%d,%d,%d,%d:%d:%d\n", year,month,day,hour,minute,second); */
}


计算一段时间使用了多少时间的方法:

	
#include <sys/time.h>
struct timeval tpstart,tpend; 
	float timeuse;
	gettimeofday(&tpstart,NULL); 
        //这里加上耗时的函数执行部分
	gettimeofday(&tpend,NULL); 
	
	 timeuse=(tpend.tv_sec*1000+tpend.tv_usec/1000)-(tpstart.tv_sec*1000+tpstart.tv_usec/1000); 
	 __android_log_print(ANDROID_LOG_INFO, "BroovPlayer", "updateSurface time is %f",timeuse);  //这里是打印,时间单位是ms


	 

下面是读取当前日期时间:

#include <sys/time.h>
time_t tCurrentTime;
struct tm *tmnow;
struct timeval tv;
time(&tCurrentTime);
gettimeofday(&tv,NULL);
tmnow = localtime(&tCurrentTime);
sprintf(strFileName, "%04d%02d%02d%02d%02d%02d%03ld.jpg",
tmnow->tm_year+1900, tmnow->tm_mon+1, tmnow->tm_mday,
tmnow->tm_hour, tmnow->tm_min, tmnow->tm_sec, tv.tv_usec / 1000);
return 0;


得到当前系统时间的毫秒数:
  struct timeval tv = {0};
    gettimeofday(&tv, 0);
    return tv.tv_usec/1000;

#ifdef AV_READ_TIME
#define START_TIMER                             \
    uint64_t tend;                              \
    uint64_t tstart = AV_READ_TIME();           \

#define STOP_TIMER(id)                                                    \
    tend = AV_READ_TIME();                                                \
    {                                                                     \
        static uint64_t tsum   = 0;                                       \
        static int tcount      = 0;                                       \
        static int tskip_count = 0;                                       \
        if (tcount < 2                        ||                          \
            tend - tstart < 8 * tsum / tcount ||                          \
            tend - tstart < 2000) {                                       \
            tsum+= tend - tstart;                                         \
            tcount++;                                                     \
        } else                                                            \
            tskip_count++;                                                \
        if (((tcount + tskip_count) & (tcount + tskip_count - 1)) == 0) { \
            av_log(NULL, AV_LOG_ERROR,                                    \
                   "%"PRIu64" decicycles in %s, %d runs, %d skips\n",     \
                   tsum * 10 / tcount, id, tcount, tskip_count);          \
        }                                                                 \
    }
#else
#define START_TIMER
#define STOP_TIMER(id) { }
#endif

#include <stdio.h>
#include <inttypes.h>

///#define DEBUG_X86

typedef unsigned long long uint64_t;
typedef unsigned int uint32_t;

/*
将计算机启动以来的CPU运行周期数放到EDX:EAX里面,EDX是高位,EAX是低位。
  CPU运行周期数指的是CPU的一个时钟触发吧,就是应该是一个上升沿或者一个下降沿表示一个周期。
  有一点你应该明白:周期数/CPU主频 = CPU通电以来的执行秒数,也就是GetTickcount干的事情。
  或者这样说使用两次RDTSC,把两次的结果相减,得到“间隔周期数”,间隔周期数/CPU主频=CPU执行这两条指令间的秒数
  这样我们就能使用太来做一些anti了
*/
/*static inline uint64_t read_time(void)
{
    uint32_t a, d;
    __asm__ volatile("rdtsc" : "=a" (a), "=d" (d));
    return ((uint64_t)d << 32) + a;
}
*/
#if defined(__ARM_ARCH_7A__) 
static inline uint64_t read_time(void)
{
    unsigned cc;
    __asm__ volatile ("mrc p15, 0, %0, c9, c13, 0" : "=r"(cc)); ///这个是 ARMV7指令集
    return cc;
}
#endif

#define AV_READ_TIME read_time

#ifdef AV_READ_TIME
#define START_TIMER                             \
    uint64_t tend;                              \
    uint64_t tstart = AV_READ_TIME();           \

#define STOP_TIMER(id)                                                    \
    tend = AV_READ_TIME();                                                \
    {                                                                     \
        static uint64_t tsum   = 0;                                       \
        static int tcount      = 0;                                       \
        static int tskip_count = 0;                                       \
        if (tcount < 2                        ||                          \
            tend - tstart < 8 * tsum / tcount ||                          \
            tend - tstart < 2000) {                                       \
            tsum+= tend - tstart;                                         \
            tcount++;                                                     \
        } else                                                            \
            tskip_count++;                                                \
        if (((tcount + tskip_count) & (tcount + tskip_count - 1)) == 0) { \
             printf( "%"PRIu64"decicycles in %s, %d runs, %d skips\n",  \
                   tsum*10/tcount, id, tcount, tskip_count);          \
        }                                                                 \
    }
#else
#define START_TIMER
#define STOP_TIMER(id) { }
#endif


 
#define LOOP_TIME 1024*1024
int main()
{
   int buf[LOOP_TIME];
   
   printf("sizeof(unsigned long long) is:%d\n",sizeof(unsigned long long));
   
   START_TIMER
   for(int i=0;i<LOOP_TIME;i++)
   {
     buf[i]=i;	
   }
	STOP_TIMER("---->>---")
	
	return 0;
}
/*====================================另一个的测试:
在32位平台 typedef unsigned long long int  uint64_t;
在64位平台 typedef unsigned long int   uint64_t;
不同的typdef,要求在printf中使用不同的length modifier,uint64_t 在32位使用ll,在64位使用l。除了定义数据类型,C99还定义了相应数据类型的打印方式,使用PRIu64打印uint64,举例如下:
 

 1 #include <stdio.h>
 2 #include <inttypes.h>
 3  
 4 int main(int argc, char *argv[])
 5 {
 6     uint64_t u64 = 100;
 7     printf("uint64: %"PRIu64"\n", u64);
 8     // printf("uint64: %lu\n", u64);   x86_84
 9     // printf("uint64: %llu\n", u64);  x86
10     return 0;
11 }
*/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值