2014-07-11 57 views
9

我一直有一個應用程序(它同時使用Java和C++和OpenCV),這似乎是執行各種任務所需的時間非常不一致的問題。爲了幫助診斷,我在java中創建了一個函數(叫做one_off_speed_test()),它在一個循環中做了一系列整數運算問題,只花了大約半秒的時間,然後將時間打印到日誌中。如果我從onCreate()內重複調用此函數,則每次呼叫所用的時間非常一致(+ = 3%),但如果我從onCameraFrame()內調用此函數,即OpenCV在相機準備好圖像時調用的函數,那麼在每個框架中進行數學測試所花費的時間就會隨着兩倍而變化。我決定嘗試eclipse/DDMS中的執行採樣器,看看我是否可以計算出發生了什麼。我看到,當我點擊one_off_speed_test()時,它列出了該功能的父母和子女,以及一行說「(上下文切換)」的行。然後在該行的標題爲「Incl Real Time」的欄下,它顯示「66%」。現在我在使用DDMS方面並不擅長,並且我對於上下文切換隻有一個朦朧的想法,但從目前的描述來看,它看起來像是我的上下文切換問題花了很多時間?還是我誤解了DDMS輸出。上下文切換使用了大量的時間嗎?

enter image description here

回答

2

上下文切換描述了花費執行其它線程的時間。所以,當你的函數從onCameraFrame()被調用時,它與其他線程共享CPU,不一定是屬於你的應用程序的線程。

參見答案https://stackoverflow.com/a/10969757/192373https://stackoverflow.com/a/17902682/192373

在投稿示例,onCameraFrame()花在掛鐘,其中使用4.814454秒通過one_off_speed_test()(據推測,對於10幀)14.413665秒,9.596984秒花在等待爲其他線程。這是有道理的,因爲onCameraFrame()回調與攝像機服務競爭CPU資源,攝像機服務在單獨的系統進程中運行。

+0

謝謝您的信息和其他鏈接。但我仍然有點困惑。上下文切換的時間(66%)是在另一個線程中執行另一個任務所花費的時間,還是更多地是切換過程本身的開銷? – Mick

+0

我的理解是,這是花在其他線程上的時間,而不是內核花在切換到其他線程上的時間。 –

+1

_term_ [上下文切換](http://en.wikipedia.org/wiki/Context_switch)不是指在其他線程中花費的時間,而是「存儲和恢復進程的狀態(上下文)的進程或線程,以便稍後可以從同一點恢復執行。「至於執行採樣器是什麼_reporting_,我不確定。 –