因此,在英特尔处理器上的Linux中,我们有大量的硬件性能计数器可供访问。像以前一样,使用名为perfmon2的用户空间软件,由于某种原因(例如,L1缓存未命中)等,我可以得到缓存未命中率,CPU停顿周期的值。
我的问题是,我们在Android中有这些东西吗?由于它基于ARM,我认为我们没有像x86那样强大的性能监视器计数器支持,对吧?
答案 0 :(得分:4)
ARM11和Cortex-A / R确实有硬件性能计数器。您可以在此页面上的官方ARM网站上查看:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka4237.html
由于Android也在Linux上运行,因此您可以通过“Perf Events”子系统通过用户空间软件访问性能计数器。但是,您需要编写本机C代码,其中包含“perf_event.h”并使用Android NDK构建它。在开始编写代码之前,我建议你看一下这个项目:platform / external / linux-tools-perf(https://android.googlesource.com/platform/external/linux-tools-perf/),这可能就是你想要的。我不知道任何允许直接从Java代码执行此操作的替代方法。
答案 1 :(得分:4)
除了Benny的回答,我还要补充以下内容:
linux-tools-perf项目与AOSP集成(我使用的是4.2)。它在$ AOSP / external / linux-tools-perf下。 ./linux-tools-perf/Documentation包含很多关于如何运行所有内容的信息。 perf工具内置于$ PRODUCT_OUT / system / bin / perf,作为AOSP的一部分,但未打包;你需要明确地将它推向目标。
检查Android(linux)内核以确认它支持PM:PERF_EVENTS。谷歌如何获得.config但最简单的是运行“extract-ikconfig zImage”。
需要对目标进行root访问,然后运行类似“./perf stat - testprog1”的内容来查看结果。记录/检索不同PM计数器的命令有很多参数。
请记住,大多数ARM实现都有多个内核和很多流水线。 Cortex-A9有无序执行。所以数字可能有点怪异 - 有时几乎毫无意义。
我使用ARM PMCCNTR寄存器,ARM PM循环计数器,偶尔测试代码性能。 PMUSERENR.EN和PMINTENCLR.C必须设置为PL1 +电平,然后PMCCNTR可以设置为PL0电平。请参阅ARM ARM以了解所有这些含义以及perf子系统的示例用法!
注意:所有shell变量都在$ AOSP / build / envsetup.sh中设置