【问题标题】:Raising an Event in .net - perfomance implications在 .net 中引发事件 - 性能影响
【发布时间】:2011-02-23 19:28:34
【问题描述】:

就编写性能良好的代码而言,抛出异常的成本很高。但是发起一个事件呢?因此,对 .net clr 人群提出了这个理论问题:

与一个订阅者一起引发事件的记忆含义是什么?拥有 1 000 000 个订阅者?如何计算这些影响?引发一个事件是否等同于直接调用(否则为处理程序)订阅者的成员方法?

【问题讨论】:

  • 这对于衡量自己来说是微不足道的。使用秒表。
  • @Hans,很好的答案 - 但我会留给你继续掌握它..

标签: .net performance memory


【解决方案1】:

“引发事件”通常只是意味着“调用委托”——但可能是在其列表中具有许多调用的多播委托。这些中的每一个都非常便宜......通常不比直接方法调用多,尽管有些情况更昂贵。 (IIRC,调用通过接口方法创建的委托更昂贵。)

我强烈建议您从编写最自然的代码开始,然后对其进行测试以查看其性能是否足够好。我无法立即想到一种更快 的方法来有效地调用一堆订阅者方法。我怀疑它通常与遍历接口实现列表并在每个接口上调用一个接口方法一样便宜,而且在某些情况下它可能会便宜得多。

【讨论】:

  • 我只是输入了我的答案,开头是“我相信 Jon Skeet 会想出一个更明确的答案”——嗯,我是在问这个。
  • 太好了,一如既往地感谢您的洞察力。很高兴有你在这里!
【解决方案2】:

主要含义是,如果您将事件公开,您将无法控制其影响。任何订阅者都可能需要一个小时来处理您的事件,无限期地阻止,甚至可能会抛出异常。通常这种缺乏控制并不是一个大问题,因为要么您自己控制所有订阅者,要么您正在创建一个供其他人使用的组件,然后您的组件的用户负责使用和他们订阅的事件处理程序。

引发事件与调用与订阅计数相同数量的方法的性能大致相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多