Android计算函数时间戳的方法

来源:互联网 发布:云计算的实例 编辑:程序博客网 时间:2024/06/10 19:59


http://blog.csdn.net/oujunli/article/details/17563999



对于做性能的人来说,知道时间的花在哪了是比较重要的,可以在函数前后得到系统的时间,计算时间戳能够得到每个函数的时间。

在JAVA中可以通过System.currentTimeMillis()得到:
long start_time = System.currentTimeMillis();
View.draw(canvas);
long end_time = System.currentTimeMillis();
long spend_time = end_time - start_time;
Log.i(TAG,"mView.draw: spend_time = " + spend_time);

在native的代码中,可以通过下面的方式得到函数的执行时间:
#include <stdio.h>
#include <sys/time.h>
void main ()
{
    struct timeval time;
    gettimeofday(&time, NULL);
    printf ( "\007The current date/time is: %lld\n", time.tv_sec * 1000 + time.tv_usec /1000);
}

在kernel里面,可以通过rtc,跟上层应用的时间对应起来,如下面的例子:
#include <linux/time.h>
#include <linux/rtc.h>
 
struct timespec  time_start, time_end;
struct rtc_time tm_start, tm_end;
long time_nsec = 0;
getnstimeofday(&time_start);
rtc_time_to_tm(time_end.tv_sec, &tm_start);

printk(KERN_ERR "\n (%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n",
tm_start.tm_year + 1900, tm_start.tm_mon + 1, tm_start.tm_mday,
tm_start.tm_hour, tm_start.tm_min, tm_start.tm_sec, time_start.tv_nsec);


.......

getnstimeofday(&time_end);
rtc_time_to_tm(time_end.tv_sec, &tm_end);
time_nsec = time_end.tv_nsec - time_start.tv_nsec;
printk(KERN_ERR "\n  tid: %d, common: %s \n", current->pid, current->comm);
printk(KERN_ERR "\n end(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n",
tm_end.tm_year + 1900, tm_end.tm_mon + 1, tm_end.tm_mday,
tm_end.tm_hour, tm_end.tm_min, tm_end.tm_sec, time_end.tv_nsec);
printk(KERN_ERR "\n mdss_fb_commit_wq_handler  end, time_nsec : %ld \n"  , time_nsec);

当然过从java到native到kernel一个流程跟下去,有可能会发现user space里面的耗时比较多,而kernel里面却没有耗时的情况,这是因为有进程调度的存在。最近就遇到了这样的问题,user space一个函数耗时30ms,但是在kernel里面却没有花时间,因为从kernel返回到user space的时候,进行了进程调度,而此时的user space的thread block了,才会产生这样的情况,希望注意。




2014/03/12更新:

Java得到当前的年月日,时分秒格式的时间

import java.text.SimpleDateFormat;
SimpleDateFormat mFormat = new java.text.SimpleDateFormat("yyyy:MM:dd HH:mm:ss:SSS");
String time = mFormat.format(System.currentTimeMillis());


2014/03/13更新:

Native得到当前的年月日,时分秒格式的时间

timeval tv;
gettimeofday(&tv, NULL);
int milli = tv.tv_usec / 1000;


char buffer [80];
strftime(buffer, 80, "%Y:%m:%d %H:%M:%S", localtime(&tv.tv_sec));


char currentTime[84] = "";
sprintf(currentTime, "%s.%d", buffer, milli);
ALOGD("time: %s \n", currentTime);


到现今为止,终于把Android Java、Native、Kernel的时间时间对应起来了,对做系统性能的人来说,这是多么重要的事情呀!


http://blog.csdn.net/youngwhz1/article/details/17838533


此篇文章将着力于将日期和时间相关的类和方法罗列出来以备参考,故此文将持续更新。

 

1. Time类,这个类可以得到具体的日期/时间以及时区,可以在日期/时间格式与字符串及毫秒之间转换。

     (据说,使用Time类对CPU的负荷较小,不过我没有与其他的类型对比过微笑

    Time t = new Time();   //得到的是初始日期时间:19700101T000000Asia/Shanghai(0,0,0,-1,-28800)

                                            //Time t=new Time("GMT+8"); 加上Time Zone资料

     t.setToNow();   //获取当前日期时间:20140103T153540Asia/Shanghai(5,2,28800,0,1388734540)

     String str = t.format("%Y%m%dT%H%M%S");   //20140103T155737

                                                                                          //等同于 t.format2445()方法。

         

     解析一个日期/时间格式的字符串:

     t.parse("20101010T151133");   

     str = t.format2445();    //20101010T151133

     如果是一个非此格式的字符串,结果会抛出异常TimeFormatException

            t.parse("20101010151133");  //异常

            t.parse("aaa201010ddT10151133ddd");//异常

            t.parse("20101010");   //只有日期是正常的
            timeStr = t.format2445();   //20101010

 

     获取Time的各个域值:

     int year = t.year;   //2010
     int month = t.month;   //9  (0-11)此处值得注意
     int date = t.monthDay;  //10
     int hour = t.hour; // 15, 24小时制(0-23)
     int minute = t.minute;  //11
     int second = t.second;  //33

 

2. Calendar类

     DateFormat.format(dateFormat, calendar)方法,一般使用的格式是yyyy   MM  dd  hh  mm  ss,在这个方法里,时间显示的是12小时制的,如果需要显示24小时制的,把hh换成kk即可。

            String out = DateFormat.format("MM-dd hh:mm:ss", Calendar.getInstance().getTime()).toString();   //01-04 11:23:56
            out = DateFormat.format("YY-MM-DD hh:mm:ss", Calendar.getInstance().getTime()).toString();   //YY-01-DD 11:25:48 (不正确的参数)
            out = DateFormat.format("YYYY-M-D hh:mm:ss", Calendar.getInstance().getTime()).toString();   //YYYY-1-D 11:26:21 (不正确的参数)

            out = DateFormat.format("yy-MM-dd hh:mm:ss", Calendar.getInstance().getTime()).toString();  // 14-01-04 11:59:12
            out = DateFormat.format("yyyy-M-d hh:mm:ss", Calendar.getInstance().getTime()).toString();  //2014-1-4 03:02:53

            out = DateFormat.format("yyyy-M-d kk:mm:ss", Calendar.getInstance().getTime()).toString();  //2014-1-4 15:03:19

 

获取Calendar的各个域值:

            int year = Calendar.getInstance().get(Calendar.YEAR);
            int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
            int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
            int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
            int minute = Calendar.getInstance().get(Calendar.MINUTE);
            int second = Calendar.getInstance().get(Calendar.SECOND);
            out = String.format("%04d-%02d-%02d", year, month, day);  //2014-01-04
            out = String.format("%02d:%02d:%02d", hour, minute, second);  //11:27:13

 

获取本地格式的日期时间:

            out = Calendar.getInstance().getTime().toLocaleString();  //2014-1-4 下午3:04:05

 

获取系统当前时间的毫秒数:

            long currentStamp = Calendar.getInstance().getTimeInMillis();   //1388806099388
            t.set(time);
            timeStr = t.format2445();  //20140104T112350

 

3. 其他方法:

    获取开机以来非睡眠状态持续的毫秒数:(milliseconds of non-sleep uptime since boot.)

        long when = SystemClock.uptimeMillis();

    比较适合用来检测某一操作或方法执行的时间差,如:

        Log.v("test running time", "This method costs time:" + (SystemClock.uptimeMillis() - when) + "ms");

   

    获取系统当前时间的毫秒数,同Time.setToNow()方法。   

        long time=System.currentTimeMillis();    //1388803748818

        t.set(time);
        timeStr = t.format2445();   //20140104T104908

 


http://blog.csdn.net/wlwl0071986/article/details/11574979


1. 在Java层,long now = SystemClock.uptimeMillis();


2. 在native层,nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);


3. 在驱动层,s64 time = ktime_to_us(ktime_get());


https://zhidao.baidu.com/question/480730528.html


android有个获取时间的函数:systemTime(SYSTEM_TIME_MONOTONIC);我想知道SYSTEM_TIME_MONOTONIC什么意思 120

android 有个获取时间的函数 :systemTime(SYSTEM_TIME_MONOTONIC);

我想知道SYSTEM_TIME_MONOTONIC什么意思??????
zhuang0393 | 浏览 5757 次
推荐于2016-01-23 01:52:26最佳答案
获取系统当前的时间。下面的文章希望能帮到您。
在一些系统调用中需要指定时间是用CLOCK_MONOTONIC还是CLOCK_REALTIME,以前总是搞不太清楚它们之间的差别,现在终于有所理解了。
CLOCK_MONOTONIC是monotonic time,而CLOCK_REALTIME是wall time。

monotonic time字面意思是单调时间,实际上它指的是系统启动以后流逝的时间,这是由变量jiffies来记录的。系统每次启动时jiffies初始化为0,每来一个timer interrupt,jiffies加1,也就是说它代表系统启动后流逝的tick数。jiffies一定是单调递增的,因为时间不够逆嘛!

wall time字面意思是挂钟时间,实际上就是指的是现实的时间,这是由变量xtime来记录的。系统每次启动时将CMOS上的RTC时间读入xtime,这个值是"自1970-01-01起经历的秒数、本秒中经历的纳秒数",每来一个timer interrupt,也需要去更新xtime。

以前我一直想不明白,既然每个timer interrupt,jiffies和xtime都要更新,那么不都是单调递增的吗?那它们之间使用时有什么区别呢?昨天看到一篇文章,终于明白了,wall time不一定是单调递增的。因为wall time是指现实中的实际时间,如果系统要与网络中某个节点时间同步、或者由系统管理员觉得这个wall time与现实时间不一致,有可能任意的改变这个wall time。最简单的例子是,我们用户可以去任意修改系统时间,这个被修改的时间应该就是wall time,即xtime,它甚至可以被写入RTC而永久保存。一些应用软件可能就是用到了这个wall time,比如以前用vmware workstation,一启动提示试用期已过,但是只要把系统时间调整一下提前一年,再启动就不会有提示了,这很可能就是因为它启动时用gettimeofday去读wall time,然后判断是否过期,只要将wall time改一下,就可以欺骗过去了。