功能会降低性能

时间:2015-05-14 07:55:08

标签: c# performance function

我正在使用c#进行循环并做一些事情(这个循环很大,有时长达1,000,000条记录)。我想用完全相同的代码替换内联代码,除了在函数中。

我猜测性能略有下降,但它实际上会引人注意吗?

如果我有一个循环:

public void main()
{    
    int x = 0;
    for (int i = 0; i < 1000; i++)
    {
       x += 1;
    }
}

如果我做同样的事情,除非这次使用函数,我的循环会慢下来吗?

public void main()
{    
    int x = 0;
    for (int i = 0; i < 1000; i++)
    {
       x = incrementInt(x);
    }
}

public int incrementInt(int x)
{
   return x + 1;
}

编辑:

  • 修正了逻辑错误,对不起。

3 个答案:

答案 0 :(得分:4)

方法调用总是让你失望。但是,如果满足一组条件,JIT编译器可以内联您的方法,这会导致汇编代码等同于您的第一个示例(如果您修复了示例中的逻辑错误)。

您间接询问的问题是我的方法在哪种情况下被内联?有许多不同的规则,但确保内联确实有效的最简单方法是测量它。 您还可以使用PerfView查找每个方法的原因。您可以为JIT编译器提供一些提示,以放宽一些规则并使用.NET 4.5内联方法

请参阅http://blogs.microsoft.co.il/sasha/2012/01/20/aggressive-inlining-in-the-clr-45-jit/

描述了一些阻止内联的条件:

  • 使用MethodImplOptions.NoInlining
  • 标记的方法
  • 大于32字节IL的方法
  • 虚拟方法
  • 将大值类型作为参数的方法
  • MarshalByRef类的方法
  • 复杂流程图的方法
  • 满足其他更奇特标准的方法

如果您遵循规则并仔细衡量,您可以编写高性能代码,同时保持可读和可维护的代码。

答案 1 :(得分:1)

我编写了一个测试应用程序并在代码上运行性能分析器,并且函数调用比循环慢(尽管如上所述,这两个做了不同的事情。)

在VS2012中分析这些内容非常简单。只需单击“ANALYZE”菜单项并选择“Start Performance Analysis”。

答案 2 :(得分:0)

调用函数比不调用函数慢,但你可以忽略它。