引入CLR类型(类或接口)的性能成本是多少?

时间:2012-09-19 22:21:17

标签: c# .net performance clr

尽管.Net允许动态调用(例如使用反射,C#动态关键字),但是当使用诸如C#之类的语言时,我们有时会觉得有必要使用静态类型,以证明我们的程序是正确的,并且在运行时不会有输入问题。

有时这会导致我们引入接口或基类,只是为了向编译器解释'是的,我知道我传递给这个上下文的所有对象都将理解调用方法X和arg是的 - 在这里,我将使用界面定义向您证明! (例如 - .net在内部使用IReadChunkBytes接口允许将SteamReadChunkBytes或BufferReadChunkBytes对象传递给某些方法或其他方法。)

其他时候我们创建类或类型以用于其他目的,这些目的不是非常有用的类型-y,例如具有小附加行为的唯一标识符(有点像枚举),或者包含一组常量等等

我有兴趣更好地理解当我面临这样的设计决策时,编译时,运行时和其他成本是什么,我要问'我应该为了解决这个问题而定义一个新类型或接口吗? “显然,在每次这样的比较中,成本和收益将有两个方面,但总的来说,我们应该在每次这样的比较/讨论中看到“定义新类型”的相同成本。我们如何量化这些成本?

3 个答案:

答案 0 :(得分:4)

静态创建新接口或类的性能和/或空间成本始终可以忽略不计。在这个意义上,不要过多考虑它。相反,反射和后期绑定会导致严重的性能问题。你应该在每个机会都使用静态类型。

与创建新类或接口相关的成本不是性能成本。他们的人力成本更高。以下是在添加新类或接口之前应该考虑的一些注意事项的列表。无论如何,使用后期绑定或反射可能不会对您的程序有所帮​​助。这些是最后的手段。

  • 程序复杂性。虽然通常不是这种情况,但拇指的一般规则是每个类都会给应用程序增加额外的复杂性,从而使得在运行时更难理解,传递给新项目成员,记住和图表。变更变得更加难以实施。
  • 如果你真的觉得不需要上课,也许不是。也许还有其他方法可以解决您的问题,例如使用更多动态类。也许你可以使用继承或其他技术来减少重复。

答案 1 :(得分:1)

几乎所有东西都有一些运行时成本。唯一的例外是像空的空间。原因是几乎所有东西都在IL映像中记录,甚至是局部变量名,参数名,常量。所以至少会有磁盘成本,虚拟内存空间成本,工作空间成本。

就CPU而言,更多元数据会降低程序启动速度,令牌分辨率,JIT / NGEN。

但有时添加类型也会对​​性能产生积极影响。

答案 2 :(得分:0)

使用动态强类型更有可能给您带来性能问题。因此,如果您对大多数对象使用dynamic都没问题,则可能无需担心创建静态类型的成本。

旁注:如果您更喜欢动态输入,C#可能不是最适合的语言。由于大多数C#代码都是针对强类型对象,因此获取好样本会更难。