【发布时间】:2013-02-18 17:47:33
【问题描述】:
i 正在对一种算法进行一些优化,该算法在给定数组中找到大于 X 的最小数字,但随后 a i 偶然发现了一个奇怪的差异。在下面的代码中,“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);
}
谢谢
【问题讨论】:
-
我相信这可能是重复的点击这里查看[重复][1] [1]:stackoverflow.com/questions/44220/…
-
顺便说一句,使用
Stopwatch类。 -
你为什么要从
breakif? -
@HighCore:这就是为什么我们会收到想要在 LINQ 中做所有事情的问题,即使 foreach 会更好。 不要忘记 for 和 foreach。只需了解何时使用您提供的每种工具即可。
-
@Alex 那是
O(n*log(n))而不是O(n)。您无需对整个事物进行排序即可获得最小/最大值。哦,如果您先进行过滤,您会更快地执行所有操作,而不是在最后进行过滤。
标签: c# performance for-loop foreach