我有一个读取实时传感器数据的服务。数据按顺序读取,4种不同类型,每种间隔约50 ms。实际上传感器数据来自蓝牙,但是服务从inputStream中读出。
现在至关重要的是,数据在到达时加上时间戳,尽可能精确,这就是我遇到gc问题的地方。如果gc在读取数据和加时间戳之间起作用,即使20毫秒也会导致难看的结果。同样重要的是数据永远不会有较大的间隙,因为我在相同的数据类型之间已经有200毫秒。
另一方面,我希望将数据实时传输到应用程序(迷你延迟是可以的)。 我设法编写服务,以便它在开始时分配所有对象,并且永远不会为GC生成任何垃圾。但对于IPC,我需要创建可分配的对象以将它们发送到应用程序。
问题1:如果我创建这样的对象并通过IPC将它们发送到应用程序,那么它们是否存在?由于2个进程不共享内存。
问题2:使用IPC是否会降低我的性能?因为我可以简单地让服务在同一个过程中运行,并且更容易共享数据10次。
该应用程序将具有GC,因此如果服务在同一进程中运行,则存在GC破坏实时数据处理的危险。但是,如果我将它们分成2个过程,我担心IPC会让我失去一些可能超过GC问题的性能。
该服务仅适用于一个应用程序,但应尽可能不间断地运行并尽可能实时地提供其数据。那么把它放在自己的过程中呢?
答案 0 :(得分:1)
现在至关重要的是,数据在到达时加上时间戳,尽可能精确,这就是我对gc有问题的地方。
请使用RTOS达到这种精确度。 Android不是RTOS。
问题1:如果我创建这样的对象并通过IPC将它们发送到应用程序,那么它们是否存在?
在这两个过程中。这就是为什么你应该摆脱第二个过程,因为你不需要它。
问题2:使用IPC是否会降低我的性能?
绝对。 IPC价格昂贵。
因为我可以简单地让服务在同一个过程中运行,并且更容易共享数据10次。
请做。
该应用程序将具有GC,因此如果服务在同一进程中运行,则存在GC破坏实时数据处理的危险。
任何过程中的任何GC都可能“破坏实时数据处理”。 任何过程中的任何工作都可能“破坏实时数据处理”。目前使用的绝大多数Android设备都是单核,而且一个核心一次只能做一件事。即使对于多核设备,您也无法控制与核相关的进程和线程调度,因为它仅由固件管理。
同样,您的项目似乎需要RTOS,Android不是RTOS。
所以把它放在自己的过程中?
您应该使用合适的RTOS,而不是Android。
如果出于某种原因,您选择坚持使用Android,请不要将其放在自己的进程中,因为它不会帮助您,只会浪费RAM和CPU时间。但是你的延误通常会超过你认为“丑陋”的20ms水平。