2011-12-30 55 views
2

我有一種讀取實時傳感器數據的服務。數據按順序讀取,每種間隔50毫秒有4種不同的類型。實際上,傳感器數據通過藍牙傳輸,但是通過服務從輸入流讀出。有關實時數據傳輸性能的服務和流程

現在至關重要的是數據在其到達時以最精確的可能性加蓋時間戳,那就是我對gc有問題的地方。如果gc在閱讀數據和加蓋時間戳之間踢球,即使是20 ms也會導致難看的結果。同樣重要的是,數據永遠不會有更大的差距,因爲我已經有了相同的數據類型之間的200毫秒。

另一方面,我希望數據能夠實時傳輸到應用程序(迷你延遲是好的)。 我設法編寫服務,以便它在開始時分配所有對象,並永遠不會爲GC生成任何垃圾。但是對於IPC,我需要創建parcelable對象來將它們發送給應用程序。

問題1:如果我創建這樣的對象,並通過IPC發送給應用程序,他們存在誰的內存?由於2個進程不共享內存。

問題2:使用IPC會降低性能嗎?因爲我可以簡單地讓服務在同一個進程中運行,並且更容易共享數據10次。

該應用程序將具有GC,因此如果該服務在相同的過程中運行,則存在GC中斷實時數據處理的危險。但是,如果我把它們分成兩個進程,恐怕IPC會讓我的性能超過GC麻煩。

該服務僅適用於一個單一的應用程序,但應儘可能不間斷地運行,並儘可能實時地提供其數據。所以把它放在自己的過程中呢?

回答

1

現在至關重要的是數據在其到達時以最精確的可能性加蓋時間戳,那就是我對gc有問題的地方。

請使用該RTOS精度。 Android不是一個RTOS。

問題1:如果我創建這樣的對象並通過IPC發送給應用程序,他們存在哪些內存?

在這兩個過程中。這就是爲什麼你應該擺脫第二個過程,因爲你不需要它。

問題2:使用IPC會降低性能嗎?

絕對。 IPC是昂貴的。

因爲我可以簡單地讓服務在同一個進程中運行並且更容易共享數據10次。

請做。

該應用程序將具有GC,因此如果該服務在同一個進程中運行,則存在GC中斷實時數據處理的危險。

任何進程中的任何GC都可能「破壞實時數據處理」。 任何過程中的任何工作都可能「破壞實時數據處理」。目前使用的絕大多數Android設備都是單核,而且一個核心一次只能做一件事。即使對於多核設備,您也無法控制與核心相關的進程和線程調度,因爲它僅由固件管理。

同樣,您的項目似乎需要RTOS,Android不是RTOS。

那麼把它放在它自己的過程中還是沒有?

您應該使用合適的RTOS,而不是Android。

如果出於任何原因選擇堅持使用Android,請勿將其放在自己的進程中,因爲它不會幫助您,並且浪費RAM和CPU時間。但是你的延遲通常會超過你認爲的「醜陋」的20ms。

+0

也許我一直有點激烈,但我真的很想進入系統輸出在GUI上的延遲是最小的。我必須堅持使用android作爲整個應用程序已經存在,即時重寫一個數據源,我想盡可能快和完美。但將其與應用程序放在同一個過程中應該是朝着這一目標邁出的重要一步。 – NikkyD 2011-12-30 23:11:08