使用事件有多少性能开销?

我对编程很新,而且我对OOP的知识有限,我决定使用事件在我的类之间进行通信。 当然,这将导致相当多的事件。

我想知道使用事件是否还有额外的开销? 我假设除非事件被执行(即,类中有一个监听器根据被触发的事件执行一个函数),那么应该没有太大的影响。 但是我并不熟悉C#中的事件,并且想要确认是否仅仅为了触发事件而产生了大量的额外开销?

我想知道使用事件是否还有额外的开销? 我假设除非事件被执行(即,类中有一个监听器根据被触发的事件执行一个函数),那么应该没有太大的影响。 乙

一般来说,这是事实。 引发事件的标准模式除了检查调用列表以查看是否存在订阅者之外什么都不做,如果没有侦听器则返回,在大多数情况下在性能方面将是非常小的,并且可能不会是一个问题。

即使存在订阅者,使用事件的开销仍然相当小,因为它们通过委托调用有效地调用订阅者处理程序,这仍然相对较快(尽管比直接方法调用慢)。 只要你不是在非常紧密的循环中这样做,它可能是微不足道的。

话虽如此,这与任何表现问题一样,归结为衡量标准 。 如果没有实际测量,您无法知道实际使用情况有多重要。 为了确定在您的具体情况下这是否是一个合理的设计选择,您需要分析事件的使用情况,以确保它不是一个重要问题。

是否有使用事件的额外开销?

嗯,是的 – 你有一个MulitcastDelegate ,代码检查以查看事件处理程序是否实际附加,等等。

是否只是为了解雇一个事件而产生大量的额外开销?

啊 – 真正的问题。 有开销,但它有意义吗? 这只能通过测量来回答。

我的猜测是,您遇到的任何开销都不会很大(否则会出现关于在性能关键型应用程序中使用事件的警告,我还没有看到),并且您的应用程序还有其他部分会对性能产生更大的影响。

我不确定是否有人量化了开销,但对于大多数用途来说它可能很小。 如果您不熟悉编程,那么您可能不会首先编写超高性能代码(如果您是,您可能不会使用C#,对吧?)

要注意的一件事是发布事件的范围。 您最终可能会遇到特定事件的数十个订阅者,但实际上只有一两个订阅者真正关心事件的给定实例。 这可能导致显着的开销。 在这种情况下,可能值得研究System.Observable反应式编程范例。 这可以通过允许您仅在那些实际关心给定事件的订阅者上调用处理程序来帮助限制过度广播。

是的,有开销。 是的可能很重要。 这也不难certificate。 事件是多播委托,委托就像方法一样阻塞直到完成。

这些是比较两者的实际时间,用于执行相同的工作量:使用事件时间完成271271.687毫秒= 271.271687秒

不使用事件时间完成123214.514毫秒= 123.214514秒

使用事件最佳“适合”的事件。