使用代表会减慢我的程序吗?
我一直在避开它们,因为我真的不知道它们是否会使我的程序变慢。我知道我是否会导致(捕获)异常,这会占用大量 CPU 资源,但我不知道委托和事件以及 .NET 对它们做了什么。
代表们非常非常快。不如直接方法调用快,但也不远。它们成为瓶颈的可能性微乎其微。
(同样的例外,如果使用得当,实际上很少会导致性能问题。)
使用委托会让你的代码更简单、更易读、更健壮吗?如果是这样,请使用它们。仔细衡量你的表现,并密切关注它。只有在数据清晰时才为了性能而远离可读性。
我确信有一些图表显示了委托、接口和非虚拟方法调用的速度等——我不知道它们在哪里,但如果你真的担心的话,你总是可以自己运行测试。
只是对 Jon 的帖子的一个小补充:当以正常的 C# 方式使用时(即通过 lambdas/匿名方法/事件处理程序/等),它们肯定非常快 - 但请注意,委托的另一个重要用途是执行动态代码(在运行时构建的方法,或通过反射和 Delegate.CreateDelegate 的现有方法)。当以第二种方式使用时,委托提供了非常显着的速度提升(与反射调用等相比)。
所以不要羞于使用代表。特别是,如果有疑问 - 为实际代码测量它:如果它仍然只占总执行时间的 0.01%,它是否需要 1 或 100 个微型黄鼠狼* 是没有意义的。
*=只是一些任意少量的时间......
在编程方面,性能可能是一个敏感的话题。例如,有些人坚决认为拳击是万恶之源。其他人认为字符串连接对性能有很大影响。
实际上,一切都是相对的,这一切都归结为您所谈论的背景。如果您在移动设备上编程,那么您将比在桌面应用程序上进行更多优化。
它通常归结为性能和代码优雅之间的权衡。假设您制作了世界上最优雅、可维护和可理解的代码库。一旦我们进行了一些性能优化,我们就开始用一些可能违反直觉的、非常专业的东西来混淆代码。如果我们去城里优化它,我们可能会节省 5% 或 10% 的性能,但在此过程中完全破坏了代码的优雅。
问题是“值得吗?”。
如果性能对您的项目至关重要,那么请在您的代码上运行分析器。如果您发现 90% 的处理器时间被一种效率特别低的方法占用,那么该方法是一个很好的优化候选者。除非您正在开发性能关键的应用程序,否则通常不值得追求低性能优势。
我在 Windows CE 上工作,所以这种事情有时更相关。例如,粗鲁的反射应用真的很伤人,所以我们倾向于在合理的地方避免反射(显然反射的小应用就可以了)。显然我在桌面上没有这种疯狂。
我听到人们抱怨代表和 CE 的表现,但就我而言,这完全是胡说八道。我听说它“将方法调用减慢了 30%”,但如果那是糟糕算法的 30%,那么这是谁的错呢?CE 中的另一个慢点是虚拟方法,因为没有查找表,它第一次手动计算它们并缓存结果。这意味着如果你把所有的内存都弄脏了,这些缓存将被清除,这将导致下一轮的性能命中。但考虑到这一点,您是否应该为了性能而放弃有用的 OOP 技能?
我发现很多这些“OMG 不要使用它太慢”只是借口。主要是借口,因为人们不知道他们的应用程序真正出了什么问题,并且很容易将责任归咎于 CLR 的某些内部工作而不是他们自己的代码。如果你的表现很糟糕,那么我认为 99.9% 的时间你可以在你的应用程序或设计部分中进行一些更改,而不会丢弃工具并带来更好的改进。