方法封装的性能成本

5

封装方法会带来性能成本吗?这里举一个非常简单的例子:

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

上述函数是否会被内联?如果是,那么与从代码中调用Math.Floor()完全相同吗?在撰写本文之前,我进行了谷歌搜索。


2
你为什么要这样做? - Kevin Avignon
6
如果存在性能开销,你应该真的担心吗?换句话说,您当前是否存在已进行过分析且起源是这种特定方法的性能瓶颈? - Sehnsucht
2
@Sehnsucht 不是的。我只是好奇而已;问一下也没有什么伤害,对吧? - Krythic
2
@Krythic:是的,问一下绝对没有任何问题。人们应该指引你朝正确的方向前进。 :) - displayName
1
@displayName 但人们并没有... 正确的方向:阅读Eric Lippert的horses。然后阅读一些关于C#内联的内容(例如https://dev59.com/bHRB5IYBdhLWcg3wc3A0)。如果您仍有问题,请进行测量和更新您的问题(或自我回答)。 - Alexei Levenkov
显示剩余4条评论
1个回答

8
该方法可能会被内联(在JIT时间,C#编译器不会在IL中内联该方法)。即使没有,成本也不太可能影响您的整个程序。由于优化和性能数字是特定于特定代码/应用程序的,因此如果您遇到性能问题,需要测量您的情况。
特别是MSDN上的编写更快的托管代码:了解所需成本文章为未优化的方法调用估计了最高6.8纳秒的成本(对于2003年级的机器)。
考虑阅读该文章的其余部分。特别是表格3不仅谈论了方法调用的成本,还提到了像加法、减法、乘法和除法这样微不足道的操作的成本。
如果您需要确认方法是否已内联-许多SO问题都涵盖了这一点,例如我可以检查C#编译器是否已内联方法调用吗?

"如果你想知道这样微不足道的事情,你应该被告知。" 和 "先制作一个可行的软件,然后再进行优化,而不是过早地进行优化。但我真诚地认为这是一个不好的答案。" - Krythic
displayName,你应该考虑提供一个接近答案的内容...(也许删除关于其他可能答案的元评论)。 - Alexei Levenkov
@AlexeiLevenkov:更新了我的回答。如果他现在感到满意,请求一个伟大的人点赞。 :D - displayName
@displayName 我“稍微”编辑了您的帖子,以展示我认为可以通过重新措辞您提供的信息来回答问题的内容。我的主要关注点是6.8ns似乎只是凭空想象出来的... 如有需要,请随意回滚。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接