MonoDevelop 的重构操作好像把foreach 变成了比较慢的for 循环?
MonoDevelop's refactoring operation seems to convert foreach into slower for loop?
这是我的代码
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 个刻度
一般来说,C# 中的枚举器不被认为是高性能的。然而,在这种情况下,MonoDevelop 试图优化枚举器的尝试非常糟糕。假设 GetCompanies() returns 一个数组,优化后的代码应该是这样的:
Company[] companies = core.GetCompanies("Dual");
for (int i=0; i<companies.Length; i++)
{
Console.WriteLine (companies[i].Name);
}
编译器有可能使用这样的索引器而不是枚举器。因此,此代码可能与原始代码执行完全相同。
这是我的代码
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 个刻度
一般来说,C# 中的枚举器不被认为是高性能的。然而,在这种情况下,MonoDevelop 试图优化枚举器的尝试非常糟糕。假设 GetCompanies() returns 一个数组,优化后的代码应该是这样的:
Company[] companies = core.GetCompanies("Dual");
for (int i=0; i<companies.Length; i++)
{
Console.WriteLine (companies[i].Name);
}
编译器有可能使用这样的索引器而不是枚举器。因此,此代码可能与原始代码执行完全相同。