C# 类继承对性能的影响

C# 类继承对性能的影响,c#,performance,C#,Performance,因此,对许多人来说,这似乎是一个非常奇怪的问题,但这里是: 假设您有一个抽象类“Object”,其中包含一个抽象方法doStuff(),10.000个类从中继承 然后在另一个类中,您有一个“对象”字典,其中包含100个“对象”类型的随机对象。对它们调用doStuff() 课程的数量是否对绩效有影响?可执行文件如何找到要执行其方法的类?这是一个跳转表,一个指针表,一个巨大开关盒的等效逻辑吗 如果它对性能有任何影响,是否有不同的方法来构造代码以消除此问题 我觉得我真的想得太多了。调用doStuff时

因此,对许多人来说,这似乎是一个非常奇怪的问题,但这里是:

假设您有一个抽象类“Object”,其中包含一个抽象方法doStuff(),10.000个类从中继承

然后在另一个类中,您有一个“对象”字典,其中包含100个“对象”类型的随机对象。对它们调用doStuff()

课程的数量是否对绩效有影响?可执行文件如何找到要执行其方法的类?这是一个跳转表,一个指针表,一个巨大开关盒的等效逻辑吗

如果它对性能有任何影响,是否有不同的方法来构造代码以消除此问题


我觉得我真的想得太多了。

调用
doStuff
时没有明显的性能影响

在运行时,您调用的对象类型肯定是已知的。在编译时,您需要一个巨大的switch语句,因为您不知道它的类型。CLR发现您正试图调用
子类0679
上的
doStuff
,进入该类并调用该方法。就这么简单


这样想吧
ToString()
Object
中声明,所有类都继承
Object
。当你对某个东西调用
ToString()
时,它真的很慢吗?否。

派生类的数量可能会产生一些影响

特别是,有一万个派生类,只有100个对象,对
doStuff
的每次调用实际上都是对一个独立于其他函数的唯一函数的调用。这意味着您的缓存将不会非常有效

不过,这是一个相当不现实的情况。一个可能是一万个不同派生类中任意一个的集合在实际操作中不太可能出现


从这个角度来看,.NET(整体)由大约九千九百个类组成。一个大小合适的应用程序可以很容易地添加到一万个所需的一百个或更多的数据——但您所说的集合可以包括.NET中的任何内容,再加上应用程序中的任何内容。我觉得很难想象在什么情况下这可能是有意义的。

如果你出于好奇而把这个问题作为一个假设性的问题来问,那就很公平了

但是,如果您试图过早地优化某些代码,而这正是您正在做出的决策级别,我强烈建议您首先集中精力使代码正常工作,然后使用探查器将热点识别为需要优化的区域

此外,经过超级优化的代码通常可读性和可维护性差得多


除非您的代码是一个游戏引擎或执行一些巨大的计算,否则它真的需要如此优化吗?如果代码与外部世界(网络、磁盘、数据库等)进行通信,那么由于使用继承,延迟将完全使任何不可察觉的时间差异相形见绌

我只是想再次指出,我的问题有C标记,而不是java标记。但由于这些相似之处,我毫不犹豫地相信它们是相同的(尽管如此,请为其他人更正您的答案)。另外,你能详细介绍一下类加载器吗?@奇怪的哦!但在C#中基本上是一样的。在.Net word中,每个对象都携带一些额外的信息,即不仅仅是程序员在对象是其实例的类中编写的成员。在运行时,这些额外信息(不仅)用于调用正确的
DoStuff
方法。所以,实际上,从object继承2个或2000个类在解析调用Easy的正确方法方面没有任何区别。例如:一个大型游戏,其中每个项目都有完全独特的功能,因此需要运行特定的代码。在这种情况下,问题是不要切换到函数指针字典,所有指针都指向单个类中的函数。项目参数将需要分离,因此它也有它的缺点。有趣的是,对于一个专门设计用于处理最荒谬负载的游戏引擎/框架来说,我仍然认为算法本身比使用继承与字典更重要。使用诸如预先计算值或设计算法等技术将数据的值块保存在处理器缓存中。祝你好运!!