【问题标题】:Is context switching using up significant time?上下文切换是否会占用大量时间?
【发布时间】:2014-09-02 09:51:43
【问题描述】:

我遇到了一个应用程序(同时使用 java 和 C++ 以及 OpenCV)的问题,该应用程序在执行各种任务所需的时间方面似乎非常不一致。为了帮助诊断这一点,我在 java 中创建了一个函数(称为one_off_speed_test()),它只在大约半秒的循环中处理了一系列整数数学问题,然后将所用时间打印到日志中。如果我从onCreate() 中重复调用此函数,那么每次调用所花费的时间非常一致(+= 3%),但如果我从onCameraFrame() 中调用它,OpenCV 在准备好图像时调用它从相机拍摄,然后每个帧中数学测试所用的时间变化最多为两倍。我决定在 eclipse/DDMS 中尝试执行采样器,看看我是否能弄清楚发生了什么。我看到当我点击one_off_speed_test() 时,它列出了该函数的父母和孩子,以及一行“(上下文切换)”。然后在该行上,在标有“Incl Real Time”的列下,显示“66%”。现在我对DDMS的使用不是很熟练,对上下文切换只有一个模糊的想法,但是从目前的描述来看,是不是我有上下文切换占用大量时间的问题?还是我误解了 DDMS 的输出。

【问题讨论】:

    标签: android opencv android-ndk profiling android-traceview


    【解决方案1】:

    上下文切换描述了执行其他线程所花费的时间。因此,当您的函数从 onCameraFrame() 调用时,它会与其他线程共享 CPU,不一定是属于您的应用程序的线程。

    另见答案https://stackoverflow.com/a/10969757/192373https://stackoverflow.com/a/17902682/192373

    在发布的示例中,onCameraFrame() 在挂钟上花费了 14.413665 秒,其中 one_off_speed_test() 使用了 4.814454 秒(大概是 10 帧),还有 9.596984 秒用于等待其他线程。这是有道理的,因为onCameraFrame() 回调与在单独的系统进程中运行的相机服务竞争 CPU 资源。

    【讨论】:

    • 感谢您提供的信息和其他链接。但我还是有点困惑。上下文切换的时间(66%)是在另一个线程中执行其他任务所花费的时间,还是更多的是切换过程本身的开销?
    • 我的理解是花在其他线程的时间,而不是内核切换到其他线程的时间。
    • term Context switching 不是指在其他线程中花费的时间,而是“存储和恢复进程或线程的状态(上下文)的过程,因此可以在以后从同一点恢复执行。”至于执行采样器报告是什么,我不确定。
    • 查看com/android/traceview/Call.java,上下文切换仅表示MethodData.mId == -1,即某些无法确定id的方法,例如属于其他进程。
    • 上下文切换很昂贵,但并不那么昂贵。尽管似乎没有记录,但它必须表示线程在运行队列上但由于其他地方的成本而没有获得 CPU 的时间。
    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 2012-05-09
    • 2015-09-07
    • 2016-07-04
    • 2021-09-21
    • 2011-01-03
    • 2017-06-01
    相关资源
    最近更新 更多