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时间获取与使用

编写Android网络程序时难免会遇到手机时间不准确的问题,本文总结了一些常用的时间获取与校正方法: 转载请注明:http://blog.csdn.net/xzy2046 1.获取本机当前时间: ...
  • xzy2046
  • xzy2046
  • 2014年11月15日 16:12
  • 2019

Android 获取系统时间的时间戳

getTime方法返回的就是10位的时间戳 public String getTime(){    long time=System.currentimeMillis()/1000;//获取系统时...
  • haozidao
  • haozidao
  • 2016年04月07日 09:44
  • 17780

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

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

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

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

Android获取时间戳,以及将时间戳转换为时间

实际开发中,服务端返回的时间一般是时间戳的格式。这时客户端就需要对时间戳做出处理,将时间戳转换为标准的时间格式。 直接上代码吧,这里不需要布局文件:package com.androidtimesta...

Android(安卓)时间戳和日期之间的转化

注:转发请注明原地址:https://www.niwoxuexi.com/blog/android/article/170... 在Android开发过程中,经常会遇到日期的各种格式转换,主要使...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

android格式化日期与时间戳学习

格式化日期主要用SimpleDateFormat类 java.lang.Object    ↳ java.text.Format      ↳ java.text.Da...
  • kluing
  • kluing
  • 2014年11月27日 20:51
  • 5949

Java、Android超精确测量代码执行时间差

平时产生随机数时我们经常拿时间做种子,比如用System.currentTimeMillis的结果,但是在执行一些循环中使用了System.currentTimeMillis,那么每次的结果将会差别很...

[c、c++]宏中"#"和"##"的用法(zz)

[c、c++]宏中"#"和"##"的用法(zz)宏中"#"和"##"的用法一、一般用法我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.用法:#include#include...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android计算函数时间戳的方法
举报原因:
原因补充:

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