LINQ vs foreach vs pour les résultats des tests de performances
Quelqu'un pourrait expliquer ces résultats?
Je sais qu'il existe des doublons de questions, mais je n'ai pas encore trouvé une seule question qui est arrivé à la même conclusion que mes résultats 😮
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;
}
}
}
}
}
OriginalL'auteur Francisco Aguilera | 2014-04-04
Vous devez vous connecter pour publier un commentaire.
Vous n'exécutez jamais le
LINQ
requête, vous venez de créer. Vous devez utiliserToList
ouToArray
méthode pour forcer une itération, probablement, vous n'obtiendrez pas un résultat différent carLINQ
utilise unforeach
boucle.Modifier:
LINQ
prend un peu plus de temps parce que vous êtes une itération sur tous les éléments. Mais dans les deux autres boucles que vous êtes en rupture de la boucle dès que vous trouvez une correspondance. Essayez d'utiliserFirstOrDefault
au lieu deWhere
et vous devriez obtenir le même (ou similaire) résultat.OriginalL'auteur Selman Genç
linq on prend pas le temps parce que la requête n'est jamais vraiment évalué.
Linq est paresseux pour la plupart des opérations, il ne sera pas réellement faire quelque chose jusqu'à ce que quelqu'un commence l'énumération des résultats.
si vous avez ajouté
puis je suis sûr que vous auriez un résultat non nul pour linq.
si vous regardez le code généré pour elle, la boucle foreach est probablement assez "plat", d'où le code généré probablement a quelques extra appels de méthode pour l'entrée/sortie de la boucle foreach, et le taux de retour des choses, et des choses comme ça.
OriginalL'auteur John Gardner
Il est apparemment importante que la Somme de stocker un coffret instance de la liste énumérateur sur le tas, et l'utilisation que l'objet tas d'itérer la liste. La ligne foreach et la boucle for à la fois éviter cela; la première parce que la Liste publique de la méthode GetEnumerator renvoie une valeur de type. Si vous stockez une référence pour les gens dans une
IEnumerable<Person>
variable, la boucle foreach prend un peu plus de temps pour arriver à son résultat.Aussi, linq a à créer des objets pour la où itérateur et le délégué est passé, et il n'est plus nulle des vérifications de sorte qu'il peut jeter informative des exceptions si l'un des arguments est null. Qui pourrait expliquer le reste du temps supplémentaire nécessaire pour le code linq.
OriginalL'auteur phoog