gpt4 book ai didi

c# - 这真的是 Linq 比 Foreach 更快的情况吗

转载 作者:太空宇宙 更新时间:2023-11-03 17:08:24 25 4
gpt4 key购买 nike

如果您搜索 Linq 更快,则 Foreach 答案总是没有 foreach。我还发现了另一个 stackoverflow 问题,其中问题 asker had not done a "warmup"所以我在我的代码中包含了一个“热身”。

由于某种原因,我的代码示例没有按预期运行。我在想我所做的是使 no linq 路径循环两次——第一次和总和。当 linq 示例进行求和时,最后只循环一次。你怎么认为?是我的测试有缺陷,还是 linq 实际上为我们带来了良好的性能提升?

    public class NumberObject { public Int32 Number { get; set; } }

public IEnumerable<NumberObject> GetNumbersWithoutLambda()
{
IEnumerable<Int32> numberRange = Enumerable.Range(0,10);
List<NumberObject> numberList = new List<NumberObject>();
foreach (Int32 item in numberRange)
{
numberList.Add(new NumberObject() { Number = item });
}
return numberList;
}

public IEnumerable<NumberObject> GetNumbersWithLambda()
{
IEnumerable<Int32> numberRange = Enumerable.Range(0, 10);
IEnumerable<NumberObject> numbers = numberRange.
Select(number => new NumberObject() { Number = number });
return numbers;
}

private void runGetNumbers(Func<IEnumerable<NumberObject>> getNumbersFunction, Int32 numberOfTimesToRun)
{
for (int i = 0; i < numberOfTimesToRun; i++)
{
IEnumerable<NumberObject> numbers = getNumbersFunction();
//numbers.Count();
numbers.Sum(item => item.Number);
//numbers.Average(item => item.Number);
}
}

[TestMethod]
public void record_speed_of_GetNumbers()
{
Int32 numberOfTimes = 10000000;

Console.WriteLine("Doing warmup... " +
TimeMethod(() => runGetNumbers(GetNumbersWithLambda, numberOfTimes)));

Console.WriteLine("GetNumbersWithoutLambda: " +
TimeMethod(() => runGetNumbers(GetNumbersWithoutLambda, numberOfTimes)) + " milliseconds");

Console.WriteLine("GetNumbersWithLambda: " +
TimeMethod(() => runGetNumbers(GetNumbersWithLambda, numberOfTimes)) + " milliseconds");
}

static long TimeMethod(Action methodToTime)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
methodToTime();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}

下面是测试的输出:

正在热身...... 7560

GetNumbersWithoutLambda:14779 毫秒

GetNumbersWithLambda:7626 毫秒

有趣的是,“热身”运行实际上似乎并不适用于这种情况。

最佳答案

当 LINQ 可以利用延迟执行时,它通常会更快;就像这里一样。

如你所料; foreach 在您的代码中完全枚举集合。 Select 只是构建一个查询来执行该枚举。

然后当您调用 Sum 时,它会枚举之前生成的集合。 foreach 总共有 2 个枚举,Select 只有一个,所以速度更快(2 倍!)

还有其他的例子; Take,而First会提早停止执行(一个foreach 可以提早停止,但大多数人不会写代码就那样)。

基本上,当您实际上需要为您正在做的事情枚举整个集合时,或者当您想要枚举(使用)LINQ 查询时,使用foreach。在运行延迟执行将为您带来性能优势的查询和操作时使用 LINQ。当该查询返回一个集合时,使用 foreach 遍历

关于c# - 这真的是 Linq 比 Foreach 更快的情况吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26810267/

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