我一直遇到app(使用java和C ++以及OpenCV)的问题,这似乎与执行各种任务所花费的时间非常不一致。为了帮助诊断这个,我在java中创建了一个函数(称为one_off_speed_test()
),它只在循环中执行一系列整数数学问题,大约需要半秒钟,然后打印到日志所需的时间。如果我在onCreate()
内重复调用此函数,则每次调用所用的时间非常一致(+ = 3%),但是如果我从onCameraFrame()
内调用它,那么OpenCV会调用它的函数从相机中准备好图像,然后在每个帧中进行数学测试所花费的时间会因任何因素而异。我决定在eclipse / DDMS中尝试执行采样器,看看我是否可以解决发生的事情。我看到当我点击one_off_speed_test()
时,它列出了该功能的父母和孩子,以及一行" (上下文切换)"。然后在该行上,在标有" 实时"的列下,它表示" 66%"。现在我在使用DDMS方面不是很专业,而且我对上下文切换只有一个朦胧的想法,但是到目前为止的描述中,看起来我的上下文切换问题需要花费很多时间吗?或者我误解了DDMS输出。
答案 0 :(得分:2)
Context switch描述了执行其他线程所花费的时间。因此,当您从onCameraFrame()
调用函数时,它与其他线程共享CPU,而不一定是属于您的应用程序的线程。
另请参阅答案https://stackoverflow.com/a/10969757/192373,https://stackoverflow.com/a/17902682/192373
在发布的示例中,onCameraFrame()
在挂钟上花费了14.413665秒,其中one_off_speed_test()
使用了4.814454秒(可能是10帧),等待其他线程花费了9.596984秒。这是有道理的,因为onCameraFrame()
回调与相机服务竞争CPU资源,相机服务在一个单独的系统进程中运行。