因此,就像在英特尔处理器上的 Linux 中一样,我们有大量的硬件性能计数器可供访问。像以前一样,使用名为perfmon2的用户空间软件,我可以获得缓存未命中率、由于某种原因导致的 CPU 停顿周期(例如,L1 缓存未命中)等值。
我的问题是,我们在 Android 中有这些东西吗?由于它基于 ARM,我认为我们没有像 x86 那样强大的性能监视器计数器支持,对吧?
因此,就像在英特尔处理器上的 Linux 中一样,我们有大量的硬件性能计数器可供访问。像以前一样,使用名为perfmon2的用户空间软件,我可以获得缓存未命中率、由于某种原因导致的 CPU 停顿周期(例如,L1 缓存未命中)等值。
我的问题是,我们在 Android 中有这些东西吗?由于它基于 ARM,我认为我们没有像 x86 那样强大的性能监视器计数器支持,对吧?
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 代码执行此操作的替代方法。
除了本尼的回答,我将添加以下内容:
linux-tools-perf 项目与 AOSP 集成(我使用的是 4.2)。它位于 $AOSP/external/linux-tools-perf 下。./linux-tools-perf/Documentation 包含大量关于如何运行所有内容的信息。perf 工具作为 AOSP 的一部分内置在 $PRODUCT_OUT/system/bin/perf 中,但未打包;您需要将其显式推送到目标。
检查 Android (linux) 内核以确认它支持 PM:PERF_EVENTS。谷歌如何获取 .config 但最简单的是运行“extract-ikconfig zImage”。
需要对目标具有 root 访问权限,然后运行“./perf stat -- testprog1”之类的东西来查看结果。记录/检索不同 PM 计数器的命令有很多参数。
请记住,大多数 ARM 实现都有多个内核和大量流水线。Cortex-A9 有乱序执行。所以这些数字可能有点怪异——有时几乎毫无意义。
我偶尔会使用 ARM PMCCNTR 寄存器(ARM PM Cycle Counter)来测试代码性能。PMUSERENR.EN 和 PMINTENCLR.C 必须设置为 PL1+ 级别,然后 PMCCNTR 可以在 PL0 级别进行管理。请参阅 ARM ARM 了解这一切的含义以及 perf 子系统的用法示例!
注意:所有的 shell 变量都在 $AOSP/build/envsetup.sh 中设置
我认为您可以尝试使用ARM® HWCPipe Exporter。
ARM® HWCPipe Exporter是一个用 Java 和 C++ 编写的 Prometheus 导出器,它从运行在 ARM® 硬件组件上的 Android 设备检索指标并将其导出到 Prometheus 监控系统。
免责声明:我是 ARM HWCPipe Exporter 的作者。