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

本文关键字:for 循环 转换 操作 重构 monodevelop foreach | 更新日期: 2023-09-27 18:11:37

这是我的代码

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 12843440个时钟节拍

for 63266749个时钟节拍

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

一般情况下,c#中的枚举数不被认为是高性能的。然而,在这种情况下,MonoDevelop试图优化枚举器是可怕的。假设GetCompanies()返回一个数组,优化后的代码应该像这样:

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

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