【发布时间】:2011-01-20 19:23:06
【问题描述】:
以下代码提供了两种方法来生成总和小于 100 的整数对,并根据它们与 (0,0) 的距离以降序排列。
//approach 1
private static IEnumerable<Tuple<int,int>> ProduceIndices3()
{
var storage = new List<Tuple<int, int>>();
for (int x = 0; x < 100; x++)
{
for (int y = 0; y < 100; y++)
{
if (x + y < 100)
storage.Add(Tuple.Create(x, y));
}
}
storage.Sort((p1,p2) =>
(p2.Item1 * p2.Item1 +
p2.Item2 * p2.Item2).CompareTo(
p1.Item1 * p1.Item1 +
p1.Item2 * p1.Item2));
return storage;
}
//approach 2
private static IEnumerable<Tuple<int, int>> QueryIndices3()
{
return from x in Enumerable.Range(0, 100)
from y in Enumerable.Range(0, 100)
where x + y < 100
orderby (x * x + y * y) descending
select Tuple.Create(x, y);
}
这段代码摘自Bill Wagner的Effective C#一书,Item 8。在整篇文章中,作者更多地关注代码的语法、紧凑性和可读性,但很少关注表演,几乎不讨论。
所以我基本上想知道,哪种方法更快?什么通常在性能上更好(一般而言):查询语法或手动循环?
请详细讨论它们,如果有的话提供参考。 :-)
【问题讨论】:
-
查询必须在某个时候陷入循环,因此必须有一些开销,即使差异可以忽略不计。
-
只是出于好奇,你能解释一下这个排序吗?:orderby (x * x + y * y) descending 我不明白它是如何工作的
-
第二个会快很多,因为它除了构建查询之外什么都不做,在执行 ToList() 之后,您将能够比较;)
-
注意:这是到 0 的距离
标签: c# performance loops code-readability linq-query-syntax