gpt4 book ai didi

C# - For vs Foreach - 巨大的性能差异

转载 作者:可可西里 更新时间:2023-11-01 03:11:51 25 4
gpt4 key购买 nike

我正在对一种算法进行一些优化,该算法在给定数组中找到大于 X 的最小数字,但后来我偶然发现了一个奇怪的差异。在下面的代码中,“ForeachUpper”以 625 毫秒结束,而“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);
}

谢谢

最佳答案

IEnumerable<T>不可索引。

Count()ElementAt()您在 for 的每次迭代中调用的扩展方法循环是 O(n);他们需要遍历集合以找到计数或第 n 个元素。

道德:了解你的收藏类型。

关于C# - For vs Foreach - 巨大的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15204950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com