LINQ vs foreach versus performance test results

Can someone explain these results? I know that there are duplicate questions, but I still have to find one question that came to the same conclusion as my results: o

using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SpeedTest { class Person { public Person(string name) { this.Name = name; } public string Name { get; set; } } class Program { static void Main(string[] args) { var people = new List<Person>(); AddTwins("FRANCISCO", people); var stopwatch = new Stopwatch(); string name = "OCSICNARF"; long linqTime = 0L; long foreachTime = 0L; long forTime = 0L; stopwatch.Start(); Person person0; var result = from person in people where person.Name == name select person; person0 = result.First(); linqTime = stopwatch.ElapsedMilliseconds; stopwatch.Restart(); Person person1; foreach (Person p in people) { if (p.Name == name) { person1 = p; break; } } foreachTime = stopwatch.ElapsedMilliseconds; stopwatch.Restart(); Person person2; for (int i = 0; i < people.Count; i++) { if (people[i].Name == name) { person2 = people[i]; break; } } forTime = stopwatch.ElapsedMilliseconds; stopwatch.Stop(); Console.WriteLine(string.Format("LINQ took {0}ms", linqTime)); Console.WriteLine(string.Format("FOREACH took {0}ms", foreachTime)); Console.WriteLine(string.Format("FOR took {0}ms", forTime)); } static void AddTwins(string name, List<Person> people) { AddTwins(people, name, ""); } private static void AddTwins(List<Person> people, string choices, string chosen) { if (choices.Length == 0) { people.Add(new Person(chosen)); } else { for (int i = 0; i < choices.Length; i++) { // choose char c = choices[i]; string choose1 = choices.Substring(0, i); string choose2 = choices.Substring(i + 1); choices = choose1 + choose2; // explore AddTwins(people, choices, chosen + c); // Unchoose string unchoose1 = choices.Substring(0, i); string unchoose2 = choices.Substring(i); choices = unchoose1 + c + unchoose2; } } } } } 

enter image description here

+8
performance c # foreach for-loop linq
source share
3 answers

You never execute a LINQ query, you just create it. You should use the ToList or ToArray to force iteration, maybe you will not get another result, because LINQ also uses a foreach .

Edit : LINQ takes a little longer because you iterate over all elements. But in your two two loops, you break the loop as soon as you find a match. Try using FirstOrDefault instead of Where , and you should get the same (or similar) result.

 people.FirstOrDefault(p => p.Name == name); 
+16
source share

linq does not take time because the request is never evaluated.

Linq is lazy for most operations, it will not actually do anything until someone starts listing the results.

if you added

 result.Count(); // add this line, query will be evaluated linqTime = stopwatch.ElapsedMilliseconds; stopwatch.Restart(); 

then i'm sure you will have a non-zero result for linq.

+1
source share

Apparently, it is important that Sum should store the instance with the shortlisted list enumerator on the heap and use this heap object to repeat the list. The built-in foreach and for loop avoid this; the first one, since the List List method GetEnumerator List returns the type of the value. If you store a link to people in the IEnumerable<Person> variable, the foreach loop takes a little longer to get the result.

In addition, linq must create objects for where the iterator and delegate passed to it, and does more than zero checks, so it can throw informative exceptions if any of the arguments is null. This may explain the remainder of the extra time required for linq code.

0
source share

All Articles