【问题标题】:Performance cost of Method Encapsulation方法封装的性能成本
【发布时间】:2015-09-19 01:03:38
【问题描述】:

封装方法是否有性能成本?一个非常简短、随意的例子:

        public static decimal Floor(decimal value)
        {
            return Math.Floor(value);
        }

上面的函数会被内联吗?如果是这样,它是否与从代码中调用 Math.Floor() 完全相同?在写这篇文章之前我在谷歌上搜索过。

【问题讨论】:

  • 你为什么要这样做?
  • 如果存在性能开销,您真的应该担心吗?另一种说法;您目前是否有性能瓶颈已被分析并且起源是这种确切的方法?
  • @Sehnsucht 不。我只是好奇;问也无妨,对吧?
  • @Krythic:是的,询问绝对没有坏处。人们应该为你指明正确的方向。 :)
  • @displayName 但人们没有... 正确的方向:阅读 Eric Lippert 的 horses。然后阅读一些关于 C# 内联的内容(如 stackoverflow.com/questions/616779/…)。如果您仍有问题(或自行回答),请衡量并更新您的问题。

标签: c#


【解决方案1】:

方法可能会被内联(在 JIT 时,C# 编译器在 IL 中内联方法)。即使不是成本也不太可能影响您的整体计划。由于优化和性能数字是特定于特定代码/应用程序的,因此如果您发现性能问题,您需要衡量您的情况。

特别是 MSDN 上的 Writing Faster Managed Code: Know What Things Cost 文章对方法调用的成本进行了以下估算:如果调用未优化,则最大 6.8 纳秒(对于 2003 级机器)。

考虑阅读本文的其余部分。特别是表 3 不仅讨论了方法调用的成本,还讨论了像加法、减法、乘法和除法一样微不足道的操作的成本。

如果您需要确认方法是否内联 - 许多 SO 问题都涉及到它,例如 Can I check if the C# compiler inlined a method call?

【讨论】:

  • "还想知道这么点小事,还是要被告知。"和“首先制作一个工作软件,然后进行优化,而不是过早地进行优化。但我真诚地认为这是一个糟糕的答案。”为两者投票。
  • displayName,您应该考虑提供接近答案的内容...(并且可能删除有关其他可能答案的元数据集)。
  • @AlexeiLevenkov:更新了我的答案。如果他现在很开心,请要求一个好人投赞成票。 :D
  • @displayName 我已经“稍微”编辑了您的帖子,以显示我认为可以通过改写您提供的信息来回答问题的内容。我主要担心的是 6.8ns 看起来像是凭空而来的......随意回滚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
相关资源
最近更新 更多