飞镖流会带来额外的开销吗?
do dart streams come with extra overhead?
我有一个关于飞镖流的一般效率问题。
我有一个项目使用了它们,但有人建议我们将几乎所有内容(函数和数据)转换为 dart 流。这是为了实现完全响应式架构。
我不知道流在幕后是如何工作的,所以我真的不知道这种设计是否会带来任何类型的内存或计算开销。
感谢您关注此问题。
是开销。不一定大,但是有
Streams 具有明确定义的异步行为,并且记录了它们如何对添加、暂停或取消的侦听器做出反应,即使在传递事件时发生这种情况(因为通常是在它发生时).
流是 异步的 ,这意味着在向流中添加事件(通过 StreamController
)和监听器接收该事件之间存在延迟.这种延迟使得有必要存储(缓冲)事件,安排一个微任务,然后取消缓冲事件并在后面的微任务中传递它。安排微任务成本。可能涉及区域,这可能需要额外费用。
最重要的是,因为流需要能够及时对 pause
和 cancel
事件做出反应,这意味着每个事件传递还需要额外检查事件处理程序是否已暂停或取消。开销不多,但确实存在。
对于单订阅流,仅此而已。
对于可以有多个侦听器的广播流,可能会有一些额外的开销来处理添加的新侦听器同时 传递事件。同样,不是很多,但它就在那里。流的状态-space实际上是相当复杂的。
(您可以创建“同步 StreamController
”来“立即”传送事件,但大多数情况下,您 不应该。这些不是为了避免异步,它们是为了避免在传播已经同步的事件时添加 extra 异步延迟,并且应该非常小心地使用它们以避免破坏代码,假设它们不会在某些事情的中间获得事件否则。一个正确实现的反应式框架将在其实现中使用这样的控制器,但这不会消除交付原始异步事件的原始固有延迟。)
现在,性能不是绝对的。在任何地方使用流都可以让您的生活更轻松,如果性能对您的应用程序来说足够好(它不会支配实际计算),那么提高的开发速度和可维护性可能会物有所值。在仅根据性能决定实施策略之前,您应该衡量(并有可重复的衡量基准)。
我有一个关于飞镖流的一般效率问题。
我有一个项目使用了它们,但有人建议我们将几乎所有内容(函数和数据)转换为 dart 流。这是为了实现完全响应式架构。
我不知道流在幕后是如何工作的,所以我真的不知道这种设计是否会带来任何类型的内存或计算开销。
感谢您关注此问题。
是开销。不一定大,但是有
Streams 具有明确定义的异步行为,并且记录了它们如何对添加、暂停或取消的侦听器做出反应,即使在传递事件时发生这种情况(因为通常是在它发生时).
流是 异步的 ,这意味着在向流中添加事件(通过 StreamController
)和监听器接收该事件之间存在延迟.这种延迟使得有必要存储(缓冲)事件,安排一个微任务,然后取消缓冲事件并在后面的微任务中传递它。安排微任务成本。可能涉及区域,这可能需要额外费用。
最重要的是,因为流需要能够及时对 pause
和 cancel
事件做出反应,这意味着每个事件传递还需要额外检查事件处理程序是否已暂停或取消。开销不多,但确实存在。
对于单订阅流,仅此而已。
对于可以有多个侦听器的广播流,可能会有一些额外的开销来处理添加的新侦听器同时 传递事件。同样,不是很多,但它就在那里。流的状态-space实际上是相当复杂的。
(您可以创建“同步 StreamController
”来“立即”传送事件,但大多数情况下,您 不应该。这些不是为了避免异步,它们是为了避免在传播已经同步的事件时添加 extra 异步延迟,并且应该非常小心地使用它们以避免破坏代码,假设它们不会在某些事情的中间获得事件否则。一个正确实现的反应式框架将在其实现中使用这样的控制器,但这不会消除交付原始异步事件的原始固有延迟。)
现在,性能不是绝对的。在任何地方使用流都可以让您的生活更轻松,如果性能对您的应用程序来说足够好(它不会支配实际计算),那么提高的开发速度和可维护性可能会物有所值。在仅根据性能决定实施策略之前,您应该衡量(并有可重复的衡量基准)。