如何在Android本机代码中获得高分辨率计时器?

我正在寻找一种在 Android上获得高分辨率计时器(时钟源)的方法.这必须是本机代码,并且可能相当不可移植.我想要微秒级的分辨率,或者更好.对于我的特定应用,分辨率比精度更重要,并且单调的计时器是最好的.我一直在测试Android 4.0.3的特定ARMv7芯片组.

到目前为止我尝试了什么:

> clock_gettime(CLOCK_MONOTONIC):在目标硬件上以1ms为单位递增(由于我的代码中的错误,我认为10ms的EDIT,1ms是正确的,但仍然不是很好)
> gettimeofday():类似于clock_gettime

我没有尝试过:

> System.nanoTime():这不是原生的.我相信它基于clock_gettime(),但我更愿意找出引擎盖下的内容并直接使用它.
> / dev / rtc
>某种ARM指令/设施,可能是SysTick(http://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARMv7-M_ARM.pdf)或通用定时器(GPT).

另见(相关问题,但没有答案):

> High-precision timer in Android JNI
> Getting High Precision Timing on Android

解决方法

您可以使用CPU周期计数器来测量两个时刻之间的周期数,然后将其转换为秒.为了保证CPU以其标称频率运行,请将其缩放调控器切换到“性能”模式(Play商店中有许多应用程序可以执行此操作,但需要root访问权限).您还必须很好地冷却您的设备,以确保CPU没有节流(这对手机尤为重要).最后,您必须将代码绑定到单个内核(最好是内核0,因为系统可以使其他内核脱机).

在ARM上访问循环计数器有两种方法:在Linux中使用perf_event子系统或直接从CP15协处理器读取循环计数器. perf_event方法只有在编译Linux内核且支持该子系统(文件/ proc / sys / kernel / perf_event_paranoid存在)且读取事件计数器不受限制时才会起作用(文件/ proc / sys / kernel / perf_event_paranoid包含0或 – 1;使用root访问权限,您可以覆盖此文件中的值).只有在启用了对性能计数器的用户模式访问时,CP15方法才会起作用(默认情况下,它始终处于禁用状态,您必须修补内核或使用内核驱动程序启用它). Yeppp! library(我是作者)能够在可用时使用任一方法,并包括内核模式驱动程序以启用对性能计数器的用户模式访问.你可能会发现this example很有帮助.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...