C#中的函数调用和事件之间是否存在性能差异?

C#中的函数调用和事件之间是否存在性能差异?,c#,events,delegates,C#,Events,Delegates,我将试图澄清我的问题: 我有一个名为Draw的函数(有人(XNA)每秒调用她60次), 我有很多要绘制的对象,所以我有以下代码: 作废提款() { obj1.draw(); obj2.draw(); obj3.draw(); .... } 如果我创建一个由Draw()引发的事件,并且所有对象都将注册该事件,是否会影响性能 如果我不清楚我问的是: 通过注册事件对函数的调用是否与常规调用不同 关于绩效,我认为相当有说服力的是,学员不会给绩效增加任何显著的开销,甚至可能会提高绩效 一个因素,你需要考虑

我将试图澄清我的问题:

我有一个名为Draw的函数(有人(XNA)每秒调用她60次), 我有很多要绘制的对象,所以我有以下代码: 作废提款() { obj1.draw(); obj2.draw(); obj3.draw(); .... }

如果我创建一个由Draw()引发的事件,并且所有对象都将注册该事件,是否会影响性能

如果我不清楚我问的是:
通过注册事件对函数的调用是否与常规调用不同

关于绩效,我认为相当有说服力的是,学员不会给绩效增加任何显著的开销,甚至可能会提高绩效


一个因素,你需要考虑事件/委托处理脱钩对象侦听事件或你的引用计数将不正确复位,你会发现自己的内存泄漏。避免匿名方法,除非您准备存储对它们的引用,以便在Dispose等上取消对它们的访问。

ildasm显示,直接调用函数是使用“call method”命令执行的,而通过事件调用是使用“callvirt delegatename::Invoke()”执行的。似乎直接调用应该更快,但是让我们考虑什么是调用()。Invoke不是委托或多播委托类的成员。这是编译器生成的一种特殊方法

.method public hidebysig virtual instance void 
            Invoke(string s) runtime managed
{
}
此方法不包含任何实现,这可能看起来很奇怪。但如果我们关注“运行时”规范,魔力就会消散。“运行时”意味着代码将在运行时生成,正如我们所知,它只会发生一次。所以从理论上讲,两者的生产率应该是相同的


至于Jon Skeet的测试,我多次启动它,并在代理的帮助下交换直接调用和调用,但没有得到代理提高性能的确认。有时代表获胜,有时直接呼叫获胜。我认为这是因为GC或.NET内部的其他东西影响了测试,或者只是通过Windows切换进程。

我不能对性能发表评论,但听起来切换到事件驱动系统将极大地提高代码的可维护性,当然是一种更好的设计。此外,事件处理程序通常在自己的线程上运行。函数调用在同一线程上运行。由于您正在谈论绘图,我认为这将涉及UI操作,因此您需要小心处理。@ryadavilli我确信,如果您正常启动事件处理程序,它们不会在自己的线程中启动。事件处理程序在当前线程上按顺序执行。