【发布时间】:2012-09-24 20:39:20
【问题描述】:
我们正在考虑重新设计我们的一些接口以使用 IObservable、Subject 和 Observer(后两个在 Reactive 扩展中)而不是标准的 .NET 事件。查看实现后,我们发现 Subject 将锁定它需要回调的 IObserver 列表,然后创建一个新数组,将 IObserver 引用复制到该新数组中,然后调用它们。
当我们查看 MulticastDelegate 的实现时,我们可以看到 MulticastDelegate.GetInvocationList 的实现还创建了一个新数组,将要调用的委托复制到该数组中,然后调用它们。不清楚的是,当您调用多播委托 GetInvocationList 时,是否会调用它,或者是否在框架内以不分配内存的方式对其进行处理。调用多播委托是否会分配一个新数组?或者框架是否会处理事情,因此在引发事件时不会分配新数组?
我们的应用程序对内存分配和延迟非常敏感,因此我们试图通过迁移到新接口来确保不会在事件调用上分配更多内存。我们还将在内部运行一些测试。
【问题讨论】:
-
如果您的应用对少量分配敏感,那么您将遇到其他问题。
-
这一特殊事件每秒可引发数千次。虽然单个分配不会对我们的应用程序造成问题,但每秒可能会有数千个小分配。
-
@Dylan 您是否使用分析器执行了代码并确定这会消耗大量系统资源?在寻找解决方案之前,请确保您确实遇到了问题。
-
@Servy - 是的,此代码位于我们应用程序的热门路径之一。这是非常时间关键的代码。我们正在评估不同的方法,因此还不能对每种方法进行分析。
-
“我们正在评估不同的方法,因此还不能对每种方法进行分析。” - 这不是本末倒置吗?!?
标签: c# .net system.reactive