Android计算函数时间戳的方法

原创 2013年12月25日 21:24:51

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

在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的时间时间对应起来了,对做系统性能的人来说,这是多么重要的事情呀!


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android和“时间”有关的一些常用函数

日期、时间什么的总是会头晕,把一些常用的记录下来,要用的时候直接Copy就好。1.如何得到当前时间的各种“年月日时分秒”等信息/** * 传入的date是你从别的地方获取的时间,如果传入null就得...
  • XieYupeng520
  • XieYupeng520
  • 2016年04月02日 18:09
  • 1618

安卓程序段——时间测试函数

程序不太流畅,不知道哪儿的问题,需要测试一下每一个函数的运行时间。         在待测函数前添加代码: Long time;//精确到毫秒! t...
  • wishchin
  • wishchin
  • 2015年09月02日 16:00
  • 603

Android生命周期中几个重要的函数

终于有时间能够安安静静地写下欠了很久的知识点,以便复习之用,如有不正确的地方,还请批评指正。 熟悉Android,我们要首先弄清楚的几个函数,莫过于这几个生命周期函数。...
  • u014796292
  • u014796292
  • 2016年09月01日 14:51
  • 672

Android 得到函数耗时多少的方法

在android开发中,有时候会遇到接口耗时过多引起anr的问题。怎样获取函数耗时呢通过System.currentTimeMillis();来获取函数开始时间以及函数结束时间,之间的时间差,就是函数...
  • wangjicong_215
  • wangjicong_215
  • 2017年02月15日 10:44
  • 398

时间:UTC时间、GMT时间、本地时间、Unix时间戳

1.UTC时间 与 GMT时间 我们可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。 2.UTC时间 与 本地时 UTC + 时区差 = 本地...
  • u012102306
  • u012102306
  • 2016年05月30日 15:52
  • 34874

Android 时间字符串 转成UTC时间转为指定时间的时间字符串

1.将传送的UTC时间转换为指定时区的时间.String destTime = "2017-03-06 18-09-18"; String dateTime = converTime(destTi...
  • cw2004100021124
  • cw2004100021124
  • 2017年03月28日 11:04
  • 1039

【Android】最近做的一个Android平台下时间统计工具

最近在完成实验室的项目之后花了一点时间弄了一个小应用。因为自己也算是手机重度手机依赖患者,平时虽然玩手机时间不长,但是很频繁,所以一直想要知道自己每天打开手机多少次,用了哪些应用,以及每个应用花了多少...
  • Sugar_Z_
  • Sugar_Z_
  • 2016年01月11日 13:18
  • 1561

Android之App启动时间的统计方法

之前有人在知乎提问: “怎么计算apk的启动时间?” : 利用python或者直接用adb命令怎么计算apk的启动时间呢?就是计算从点击图标到apk完全启动所花费的时间。比如,对游戏来说就...
  • zhangyongfeiyong
  • zhangyongfeiyong
  • 2017年03月13日 19:37
  • 1566

Android和Linux的时间戳

Android和Linux的时间戳的起点一样,都是从1970年1月1日开始,但是并不是从00:00:00开始的,而是从08:00:00开始的,我说的是北京时间。太坑了,之前一直以为时间戳的0对应的就是...
  • shikangkai
  • shikangkai
  • 2015年12月30日 22:30
  • 1114

android计算程序运行耗时

方法二: Java、Android开发中精确测量代码运行时间: long startTime = System.nanoTime(); //開始時間 // // 这里是你要测量...
  • chen1234520nnn
  • chen1234520nnn
  • 2017年09月07日 19:25
  • 498
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android计算函数时间戳的方法
举报原因:
原因补充:

(最多只允许输入30个字)