我正在使用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;
}
编辑:
答案 0 :(得分:4)
方法调用总是让你失望。但是,如果满足一组条件,JIT编译器可以内联您的方法,这会导致汇编代码等同于您的第一个示例(如果您修复了示例中的逻辑错误)。
您间接询问的问题是我的方法在哪种情况下被内联?有许多不同的规则,但确保内联确实有效的最简单方法是测量它。 您还可以使用PerfView查找每个方法的原因。您可以为JIT编译器提供一些提示,以放宽一些规则并使用.NET 4.5内联方法
请参阅http://blogs.microsoft.co.il/sasha/2012/01/20/aggressive-inlining-in-the-clr-45-jit/
描述了一些阻止内联的条件:
如果您遵循规则并仔细衡量,您可以编写高性能代码,同时保持可读和可维护的代码。
答案 1 :(得分:1)
我编写了一个测试应用程序并在代码上运行性能分析器,并且函数调用比循环慢(尽管如上所述,这两个做了不同的事情。)
在VS2012中分析这些内容非常简单。只需单击“ANALYZE”菜单项并选择“Start Performance Analysis”。
答案 2 :(得分:0)
调用函数比不调用函数慢,但你可以忽略它。