题 使用委托会减慢我的.NET程序吗?


使用代表会减慢我的程序吗?

我一直在避免它们,因为我真的不知道如果它们让我的程序变慢。我知道如果我导致(catch)异常,它使用相当多的CPU功率但我不知道委托和事件以及.NET对他们做了什么。


16
2017-11-20 09:29


起源


为什么你甚至没有接受这个问题的答案? - nawfal


答案:


代表们非常非常快。不如直接方法调用快,但不远。他们成为瓶颈的可能性微乎其微。

(同样,例外情况,如果使用得当, 实际上很少会导致性能问题。)

使用委托会使您的代码更简单,更易读,更健壮吗?如果是这样,请使用它们。仔细衡量您的表现,并密切关注它。仅在数据清晰时才为了性能而放弃可读性。

我确定有一些图表可以显示委托与接口的速度与非虚拟方法调用等 - 我不知道它们在哪里,但如果你真的担心,你可以自己运行测试。


16
2017-11-20 09:32



Jon - 我刚刚启动了反射器并查看了MulticastDelegate.CombineImpl的默认实现,并且对于该方法的冗长程度有点惊恐,并且看到它在内部重新创建数组。我以为代理人会使用链接列表合并。您是否进行过任何测试以确定它们的真实性能如何? - Mark
@Mark:不是为了合并和删除,但很少经常在我的经历中发生这种情况。通常,相同的代理被多次调用(例如对于LINQ),因此调用速度更重要。 - Jon Skeet


只是Jon的帖子的一小部分:当以正常的C#方式使用时(即通过lambdas /匿名方法/事件处理程序/等),它们肯定非常快 - 但请注意,委托的另一个重要用途是执行动态代码(在运行时构建的方法,或通过反射和Delegate.CreateDelegate的现有方法)。当以第二种方式使用时,代表提供非常显着的速度 起色 (与反射Invoke等相比)。

因此,不要害羞使用代表。特别是,如果有疑问 - 测量它是否真实的代码:它是否需要1或100微鼬*,如果这仍然只占你的总执行时间的0.01%是没有意义的。

* =只是一些任意少量的时间......


9
2017-11-20 09:41



从现在开始,我想我会在pico-fortnights中给出任何性能结果。没有人可以声称他们缺少信息,但它强调了这一点 相对的 大多数性能比较的本质。 TimeSpan上的扩展方法的时间...... - Jon Skeet
微鼬两周比微鼬更长还是更短?询问的人想知道:) - Lasse Vågsæther Karlsen
如果它有帮助,皮秒两周大约是1.2微秒 - Marc Gravell♦
@Agnel - 如果它“只占你整体执行时间的0.01%”,它仍然非常重要 - 你有更大的事情需要解决! - Marc Gravell♦
顺便说一句,考虑到微微是10 ^ -12,一个微微两周是0.0012096毫秒。可能是一种可接受的时间长度,但我非常喜欢单位微鼬。 - flq


我在Windows CE上工作,所以这种事情有时候更加贴切。例如,反射的傲慢应用确实会受到伤害,因此我们倾向于避免在合理的情况下进行反射(显然是反射的小应用) 精细)。显然我在桌面上没有这么疯狂。

我听说过人们对代表和CE表现的嘀咕声,但就我而言,我只是担心这一点。我听说它“减慢了30%的方法调用速度”,但如果这是一个糟糕的算法的30%,那么它的错误是什么? CE中的另一个减速是虚方法,因为没有查找表,它首次手动处理它们并缓存结果。这意味着如果你把所有的记忆都扯掉了,那些缓存就会被清除掉,这将导致下一次打击。但考虑到这一点,你是否应该为了表现而抛弃有用的OOP技能?

我发现很多这些“OMG不使用它太慢”只是借口。主要是借口因为人们不知道什么  他们的应用程序错了,很容易责怪CLR的一些内部工作而不是他们自己的代码。如果你的表现很糟糕,那么我认为99.9%的时间你可以改变你的应用程序或设计中不会丢弃工具并导致更好的改进的部分。


6
2017-11-20 11:59





在编程时,性能可能是一个棘手的主题。例如,有些人绝对坚持认为拳击是万恶之源。其他人认为弦乐连续剧是一个重大的表现。

实际上一切都是相对的,这一切都归结为你所谈论的背景。如果您使用移动设备进行编程,那么您将需要比在桌面应用程序上工作时更优化。

它通常归结为性能和代码优雅之间的权衡。让我们说你在世界上创造了最优秀,可维护和可理解的代码库。一旦我们进行了一些性能优化,我们就开始使用一些可能是反直觉的,非常专业的东西来实现代码。如果我们去城镇优化它,我们可能会节省5%或10%的性能,但在这个过程中,完整性会破坏代码的优雅。

问题是“它值得吗?”。

如果性能对于您的项目至关重要,那么在您的代码上运行一个分析器。如果您发现90%的处理器时间被特别低效的方法吃掉,那么该方法是优化的理想选择。除非您正在开发性能关键型应用程序,否则通常不值得追求低性能优势。


6
2017-11-20 11:32