我遇到了一个应用程序(同时使用 java 和 C++ 以及 OpenCV)的问题,该应用程序在执行各种任务所需的时间上似乎非常不一致。为了帮助诊断这一点,我在 java 中创建了一个函数(称为one_off_speed_test()
),它只在大约半秒的循环中处理了一系列整数数学问题,然后将所用时间打印到日志中。如果我从内部重复调用此函数,onCreate()
则每次调用所花费的时间非常一致(+= 3%),但如果我从内部调用它onCameraFrame()
,当 OpenCV 从相机准备好图像时调用的函数,然后每个帧中的数学测试所花费的时间变化最多为两倍。我决定在 eclipse/DDMS 中尝试执行采样器,看看我是否能弄清楚发生了什么。我看到,当我点击 时one_off_speed_test()
,它列出了该函数的父母和孩子,以及一行“ (上下文切换) ”。然后在该行上,在标有“ Incl Real Time ”的列下,显示“66%”。现在我在使用 DDMS 方面不是很专家,对上下文切换只有一个模糊的想法,但是从目前的描述来看,是不是我有上下文切换占用大量时间的问题?还是我误解了 DDMS 输出。
问问题
2087 次
1 回答
2
上下文切换描述了执行其他线程所花费的时间。因此,当您的函数从 调用时onCameraFrame()
,它与其他线程共享 CPU,不一定是属于您的应用程序的线程。
另请参阅答案https://stackoverflow.com/a/10969757/192373,https://stackoverflow.com/a/17902682/192373
在发布的示例中,onCameraFrame()
在挂钟上花费了 14.413665 秒,其中 4.814454 秒用于one_off_speed_test()
(大概是 10 帧),9.596984 秒用于等待其他线程。这是有道理的,因为onCameraFrame()
回调与相机服务竞争 CPU 资源,相机服务在单独的系统进程中运行。
于 2014-07-12T15:03:14.223 回答