.net事件的性能影响

Bro*_*ski 9 .net performance events delegates

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

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

更新:

需要明确的是,这与任何特定实现无关,这是关于在方法调用上使用事件的成本的更一般性问题.

Phi*_*eck 18

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

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

另一个编辑:哎呀这是一个更好的结果.请参阅代码了解它的工作原理

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
Run Code Online (Sandbox Code Playgroud)

所以在一条直线"什么都不做试验"十万个呼叫,事件[添加0.474秒编辑一个上,只有0.026,现在很多但是更好的机器,仍然大约一倍]

我会更担心设计的正确性,而不是每1000万次呼叫半秒,除非你期望在短时间内做那么多次呼叫(在这种情况下,可能存在更基本的设计问题).


Wim*_*nen 12

在.NET 2.0中,调用委托与接口方法调用一样快.他们甚至似乎更快一点.

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

编辑以响应事件比委托更慢的声明:实际上,事件委托.此代码表明它们的性能完全相同,至少在我的机器上是这样.