DDMS 分析器中的本机代码是啥样的?
Posted
技术标签:
【中文标题】DDMS 分析器中的本机代码是啥样的?【英文标题】:What does native code look like in the DDMS profiler?DDMS 分析器中的本机代码是什么样的? 【发布时间】:2014-04-10 22:19:26 【问题描述】:我知道 DDMS profiler 不会分析原生方法调用,我知道我可以使用多种方法来分析原生代码,但我真正想知道的是原生代码与 Java 代码的比例。
特别是,当调用本机方法时,DDMS 方法分析会做什么?时间是否仍然被记录?有问题的应用程序有一个很长的阻塞本机调用,但它显示为只需要 118 毫秒,并且在可视跟踪查看器中显示为一个很长的“下划线”(与 Java 代码中看到的实心“块”相反)。我猜测在本机代码中花费的时间没有添加到配置文件中函数的总时间中是否正确?
【问题讨论】:
【参考方案1】:Dalvik method profiler 为每个方法调用记录两个时间戳。一个来自CLOCK_THREAD_CPUTIME_ID
计时器,另一个只是挂钟时间(gettimeofday()
)。前者是对线程花费在执行代码上的时间量的粗略测量。
线程休眠时线程 cputime 时钟不会提前(例如在互斥体上阻塞),但在执行或 (IIRC) 等待磁盘 I/O 完成时会提前。最初的分析代码只是记录了线程 cputime —— 挂钟时间在一段时间前被添加到混合中,因此您可以看到该方法实际执行需要多长时间以及它有多忙。
对于托管代码和本机代码,在输入方法和返回方法时都会创建一个条目。在这方面没有真正的区别。
【讨论】:
谢谢你,特别是对探查器的链接。信息量很大。然而,这使得为什么 DDMS 将本机函数调用显示为只需要几毫秒,而它显然需要更长的时间更加令人困惑。我在 android 2.3.3 上进行分析这一事实有影响吗? 是的——分析器直到 Android 4.0 才开始记录挂钟时间。在此之前,它只有每个线程的累积 CPU 时间。因此,如果您的本机方法花费了 2 秒被阻止,然后进行了 100 毫秒的工作,则配置文件将仅显示 100 毫秒的使用时间。 (这就是添加第二个时间戳的原因。)以上是关于DDMS 分析器中的本机代码是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章