【问题标题】:What are the performance costs of introducing a CLR type (class or interface)? [closed]引入 CLR 类型(类或接口)的性能成本是多少? [关闭]
【发布时间】:2012-09-19 22:21:17
【问题描述】:

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

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

其他时候我们创建类或类型来服务于其他感觉不是很有用的类型-y,例如作为具有小附加行为的唯一标识符(有点像枚举),或者保存一组常量等.

当我面临这样的设计决策时,我想更好地了解编译时间、运行时和其他成本会是多少'显然,每次这样的比较都会有两个方面的成本和收益,但总的来说,我们应该希望在每次这样的比较/讨论中看到“定义新类型”的相同成本。我们如何量化这些成本?

【问题讨论】:

  • 您想比较哪些替代方案?我不清楚这里问的是什么。

标签: c# .net performance clr


【解决方案1】:

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

与创建新类或接口相关的成本不是性能成本。它们是更多的人力成本。下面列出了在添加新类或接口之前应考虑的一些事项。无论如何,使用后期绑定或反射可能对您的程序没有帮助。这些是不得已的技术。

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

【讨论】:

  • +1。关于人力成本的很好的说明。
  • 我真的很喜欢你关于人力成本的观点,但我仍然不同意运行时成本总是可以忽略不计的说法。当你今天面临一个单一的决定时,这些小东西似乎可以忽略不计,但随着时间的推移,我们和我们的队友会做出成百上千个这样的决定,最终它们会加起来。考虑一下,如果您的决定引入了一种架构模式,它导致创建数百种类型只是为了满足该模式?好吧,也许这也是一个不同的问题。 :) 但我们必须能够证明为什么这是一个糟糕的模式......
【解决方案2】:

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

在 CPU 方面,更多的元数据会减慢程序启动、令牌解析、JIT/NGEN。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-21
      • 1970-01-01
      • 2013-02-28
      • 2016-07-15
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      相关资源
      最近更新 更多