最近在搞上层service读取设备节点,设备节点每隔7.5ms更新一次数据,
发现使用java直接读,获取数据会丢包严重, 而且读取数据的间隔不均匀
优化的策略如下:
1.提升线程的优先级,使用android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);发现有点效果,但效果不大
2.果断使用jni进行读取,发现读取改善很大,均匀程度显度提升。c语言的read还是比java语言效率高
3.在系统负载较高时发现,还是存在丢包现象,猜测在jni native调用时,read阻塞状态下,线程挂起,cpu调度策略导致read阻塞时间长
4.果断使用poll 进行优化,poll可以设置阻塞时长,设备节点每隔7.5ms更新数据,poll阻塞时长发现设置到12ms有很大提升
//readfds中有文件句柄, 阻塞时长设置12ms
ready = poll(&readfds, 1,12);
if (ready) {
// read node data
res = readfd, buf, BUFFER_SIZE);
if (res < 0) {
ALOGE("READERR, res:%d\n", res);
return 0;
}
使用poll后发现cpu占有率会高1到2个点,即原来占有率在%2或%3,使用poll后cpu占有率会在3%或4%或5%