.net事件的性能影响

时间:2010-10-02 22:17:50

标签: .net performance events delegates

我们正在办公室讨论如何解决某个特定问题,并且提出了一个事件(没有双关语)。由于滥用行为的反应是负面的,而且价格昂贵。

我理解滥用背后的问题,我知道它们只是一个特殊的多播委托,但考虑到最多只有一个监听器的情况,为什么在方法调用中使用事件会被视为“昂贵”?

更新

要明确这不是关于任何特定实现,这是关于通过方法调用使用事件的成本的更一般性问题。

3 个答案:

答案 0 :(得分:18)

在你的场景中测试它 - 我会想象很多很多因素都会影响到这一点,特别是当我们谈论的方法/委托调用的相对成本相对较低时。

快速简单的测试,发布版本不在调试器下,在4.0下编译为“任何cpu”,并在64位Windows 7上运行:

另一个编辑:哎呀这是一个更好的结果。请参阅the code了解其工作原理

10000000 direct reference calls     :   0.011 s
10000000 calls through an interface :   0.037 s
10000000 invocations of an event    :   0.067 s
10000000 calls through Action<int>  :   0.035 s

因此,在一次直接的“不做任何测试”中,有一千万个电话,一个事件增加了.474秒[编辑,现在只有.026在很多更好的机器上,但仍然大致翻了一番]

除非你期望在短时间内进行多次通话,否则我会更担心设计的正确性,而不是每1000万次通话需要半秒钟(在这种情况下,可能存在更基本的设计问题)。

答案 1 :(得分:12)

在.NET 2.0 calling a delegate is just as fast中作为接口方法调用。他们甚至似乎更快一点。

但即使开销高出10倍,我也怀疑委托调用将成为您应用程序的速度瓶颈。如果您想找到真正的瓶颈,请使用分析器。

编辑以响应事件比委托更慢的声明:实际上,事件委托。 This code表明他们的表现是相同的,至少在我的机器上是这样。

答案 2 :(得分:4)

性能绝对不是你应该关注的事情。你在这里谈论纳秒。如果你只有一个听众,那就完全没有区别了。

我会简单地考虑在您的应用程序中使用事件或调用方法更有意义并选择最佳选项。主要区别在于生成事件的对象A不必知道其侦听器。调用方法的同一对象A必须知道要从中调用它的实例。你想把依赖放在哪里?