2014-07-11 13 views
9

Ho riscontrato problemi con un'app (che utilizza sia java che C++ e OpenCV) che sembra essere molto incoerente nella quantità di tempo necessaria per eseguire varie attività. Per aiutare a diagnosticare ciò, ho creato una funzione in java (chiamata one_off_speed_test()) che non ha fatto altro che una serie di problemi matematici interi in un ciclo che richiede circa mezzo secondo e quindi stampa il tempo impiegato per il log. Se chiamo ripetutamente questa funzione da onCreate(), il tempo impiegato per ogni chiamata è molto consistente (+ = 3%), ma se lo chiamo dall'interno di onCameraFrame(), una funzione che OpenCV chiama quando ha un'immagine pronta dalla telecamera, quindi il tempo impiegato per il test di matematica in ogni frammento varia da qualsiasi cosa fino a un fattore due. Ho deciso di provare il campionatore di esecuzione in eclipse/DDMS e vedere se riuscivo a capire cosa stava succedendo. Ho visto che quando ho cliccato su one_off_speed_test(), elencava i genitori e i figli di quella funzione, insieme a una riga che diceva "(cambio di contesto)". Quindi su quella riga, sotto una colonna denominata "Incl Real Time", si dice "66%". Ora non sono molto esperto nell'uso di DDMS, e ho solo una vaga idea del cambio di contesto, ma dalla descrizione fino ad ora, sembra che abbia un problema con il cambio di contesto che richiede molto tempo? O sto fraintendendo l'uscita DDMS.Il cambio di contesto impiega tempo significativo?

enter image description here

risposta

2

interruttore contesto descrive il tempo impiegato per eseguire altri thread. Quindi, quando la tua funzione viene chiamata da onCameraFrame(), condivide la CPU con altri thread, non necessariamente i thread che appartengono alla tua app.

Sede risponde anche https://stackoverflow.com/a/10969757/192373, https://stackoverflow.com/a/17902682/192373

Nell'esempio postato, onCameraFrame() speso 14,413,665 mila sec sulla orologio da parete, di cui 4,814,454 mila sec è stato utilizzato da one_off_speed_test() (presumibilmente, per 10 fotogrammi), e 9,596,984 mila sec è stato speso in attesa per altri thread. Questo ha senso, poiché il callback onCameraFrame() compete per la risorsa CPU con il servizio telecamera, che viene eseguito in un processo di sistema separato.

+0

Grazie per le informazioni e gli altri collegamenti. Ma sono ancora un po 'confuso. È il momento del cambio di contesto (il 66%) del tempo impiegato per eseguire quell'altra attività in un altro thread, o è più il sovraccarico del processo di commutazione stesso? – Mick

+0

La mia comprensione è che è il tempo trascorso in altri thread, non il tempo trascorso dal kernel per passare ad altre pedate. –

+1

Il parametro _term_ [Cambio di contesto] (http://en.wikipedia.org/wiki/Context_switch) non fa riferimento al tempo trascorso in altri thread, piuttosto "al processo di memorizzazione e ripristino dello stato (contesto) di un processo o thread in modo che l'esecuzione possa essere ripresa dallo stesso punto in un secondo momento. " Per quanto riguarda ciò che il campionatore di esecuzione è _reporting_, non sono sicuro. –