【发布时间】:2020-06-20 16:19:39
【问题描述】:
我已经检查过任何嵌套循环的不同性能。但是 Distinct Method 比嵌套循环快得多。
var customers = new List<Customer>();
for (var i = 1; i <= 100000; i++)
{
var id = (int)Math.Floor((decimal)i / 10);
var customer = new Customer()
{
FirstName = $"Name {i}",
ID = id,
LastName = $"Last {i}"
};
customers.Add(customer);
}
System.Console.WriteLine($"Outer Loop start :{DateTime.UtcNow}");
var ids = new List<int>();
customers.ForEach(_=> {
ids.Add(_.ID);
});
var uniqueIds = ids.Distinct();
System.Console.WriteLine($"Outer Loop End :{DateTime.UtcNow}");
System.Console.WriteLine($"Nested Loop start :{DateTime.UtcNow}");
var oids = new List<int>();
customers.ForEach(_ => {
if (!oids.Any(i => i == _.ID))
{
oids.Add(_.ID);
}
});
System.Console.WriteLine($"Nested Loop End :{DateTime.UtcNow}");
结果: 外环开始:2020 年 6 月 20 日下午 4:15:31 外环结束:2020 年 6 月 20 日下午 4:15:31 嵌套循环开始:2020 年 6 月 20 日下午 4:15:32 嵌套循环结束:2020 年 6 月 20 日下午 4:15:46
Outerloop 只用了 1 秒,而嵌套循环只用了 14 秒。 Distinct 比在 foreach 中使用“Any”函数快得多?
【问题讨论】:
-
我只是想找出客户列表中的唯一 ID。
-
循环是一样的。不同的是,我认为使用散列来获取键,这对于大量项目列表来说更快。因此,您可能正在搜索性能为 N/2 的列表,而 distinct 使用的是 log2(N) 的哈希。
-
此外,
Stopwatch类对于测量执行时间更准确。请参阅:stackoverflow.com/questions/2923283/…。 -
仅供参考,没有显示“内循环”,只有一个循环中的
if语句。 -
是的@RufusL,我在那个 if 语句中使用 Any 方法,我认为这是一个嵌套循环。
标签: c# performance linq optimization