WoF*_*gel 15 c# performance foreach for-loop
我正在对一个算法进行一些优化,该算法在给定的数组中找到大于X的最小数字,但随后ai偶然发现了一个奇怪的差异.在下面的代码中,"ForeachUpper"在625ms结束,"ForUpper"结束,我相信,几个小时(疯狂地慢).为什么这样?
class Teste
{
public double Valor { get; set; }
public Teste(double d)
{
Valor = d;
}
public override string ToString()
{
return "Teste: " + Valor;
}
}
private static IEnumerable<Teste> GetTeste(double total)
{
for (int i = 1; i <= total; i++)
{
yield return new Teste(i);
}
}
static void Main(string[] args)
{
int total = 1000 * 1000*30 ;
double test = total/2+.7;
var ieTeste = GetTeste(total).ToList();
Console.WriteLine("------------");
ForeachUpper(ieTeste.Select(d=>d.Valor), test);
Console.WriteLine("------------");
ForUpper(ieTeste.Select(d => d.Valor), test);
Console.Read();
}
private static void ForUpper(IEnumerable<double> bigList, double find)
{
var start1 = DateTime.Now;
double uppper = 0;
for (int i = 0; i < bigList.Count(); i++)
{
var toMatch = bigList.ElementAt(i);
if (toMatch >= find)
{
uppper = toMatch;
break;
}
}
var end1 = (DateTime.Now - start1).TotalMilliseconds;
Console.WriteLine(end1 + " = " + uppper);
}
private static void ForeachUpper(IEnumerable<double> bigList, double find)
{
var start1 = DateTime.Now;
double upper = 0;
foreach (var toMatch in bigList)
{
if (toMatch >= find)
{
upper = toMatch;
break;
}
}
var end1 = (DateTime.Now - start1).TotalMilliseconds;
Console.WriteLine(end1 + " = " + upper);
}
Run Code Online (Sandbox Code Playgroud)
谢谢
SLa*_*aks 47
IEnumerable<T> 不可索引.
在循环的每次迭代中调用的Count()和ElementAt()扩展方法for都是O(n); 他们需要循环遍历集合以查找计数或第n个元素.
道德:了解你的收藏类型.
Dan*_*rth 13
这种差异的原因是你的for循环将bigList.Count()在每次迭代时执行.在您的情况下,这非常昂贵,因为它将执行Select并迭代完整的结果集.
此外,您正在使用ElementAt它再次执行选择并将其迭代到您提供的索引.
| 归档时间: |
|
| 查看次数: |
20469 次 |
| 最近记录: |