c# - 调用空函数需要多长时间?

标签 c# performance function compiler-optimization

我有一个实现接口(interface)的项目列表。对于这个问题,让我们使用这个示例界面:

interface Person
{
  void AgeAYear();
}

有两个类

class NormalPerson : Person
{
  int age = 0;

  void AgeAYear()
  {
    age++;
    //do some more stuff...
  }
}


class ImmortalPerson : Person
{
  void AgeAYear()
  {
    //do nothing...
  }
}

由于其他原因,我需要他们两个列表。但是对于这个调用,当我循环遍历我的 Person 列表时,我可能会调用空函数。 这会对性能产生影响吗?如果是,有多少?是否会出于所有意图和目的优化空函数?


注意:在实际示例中,ImmortalPerson 有其他确实有代码的方法 - 它不仅仅是一个什么都不做的对象。

最佳答案

Will this have a performance impact?

极不可能产生有意义的性能影响。

If so, how much?

您可以使用分析器针对您的特定代码路径精确对其进行量化。我们不能,因为我们不知道代码路径。我们可以猜测,并几乎可以肯定地告诉您这无关紧要,因为这极不可能成为您应用程序中的瓶颈(您真的坐在那里在一个紧密的循环中调用 Person.AgeAYear 吗?)。

只有您可以通过分析仪和测量来精确找出答案。

Will the empty function, for all intents and purposes, be optimized out?

这当然是可能的,但也可能不是;它甚至可能在 JITter 的 future 版本中发生变化,或者在平台之间发生变化(不同的平台有不同的 JITter)。如果您真的想知道,请编译您的应用程序,然后查看反汇编的 JIT 代码(不是 IL!)。

但我要说的是:这几乎可以肯定,几乎绝对不值得担心或投入任何时间。除非您在性能关键代码的紧密循环中调用 Person.AgeAYear,否则它不是应用程序的瓶颈。您可以花时间在这上面,也可以花时间改进您的应用程序。您的时间也有机会成本。

关于c# - 调用空函数需要多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7191526/

相关文章:

c# - 通过 asp.net 中的代码隐藏将按钮添加到网页并删除动态数据库条目

java - 为什么在更新大型数组的元素时次要 GC 持续时间会发生如此大的变化?

objective-c - 高效和优化 Cocoa 应用的技巧

C++ 重新声明不一致/有趣

c# - Azure 驱动器、 block Blob 与表

c# - 以编程方式按下网页上的按钮

r - 在 dplyr 中确定分组数据框中最频繁因素的最快方法

c - 在 C 中将 "direct"结构作为函数传递

function - 如何检查已停止的网站并使用 powershell 函数启动这些网站

c# - 在 C# 中组合 BinaryExpression 和 Expression<Func<dynamic, bool>>