MonoDevelop的重构操作似乎将foreach转换为较慢的for循环?

时间:2015-09-06 15:32:09

标签: c# mono monodevelop

这是我的代码

foreach (Company company in core.GetCompanies("Dual"))
{
    Console.WriteLine (company.Name);
}

但是,MonoDevelop的静态代码分析可以选择将其转换为优化的for循环。

这是MonoDevelop的优化代码,

for (int i = 0, maxLength = core.GetCompanies ("Dual").Length; i < maxLength; i++)
{
    Company company = core.GetCompanies ("Dual") [i];
    Console.WriteLine (company.Name);
}

为什么第二个片段比第一个片段更优化?是不是第二个对同一个函数进行多次调用?我实际测量过它,第一个比第二个快;我使用StopWatch来计算ticks

foreach 12,843,440个蜱虫

for 63,266,749个蜱虫

1 个答案:

答案 0 :(得分:3)

通常,C#中的枚举数不被视为高性能。但是,在这种情况下,MonoDevelop试图优化枚举器是非常糟糕的。假设GetCompanies()返回一个数组,优化后的代码应如下所示:

Company[] companies = core.GetCompanies("Dual");
for (int i=0; i<companies.Length; i++)
{
    Console.WriteLine (companies[i].Name);
} 

编译器有可能使用这样的索引器而不是使用枚举器。因此,此代码可能与原始代码完全相同。