LINQ versus foreach()



  • Hallo Leute,

    aufgrund dieses Artikels:
    http://alexandershapovalov.com/blog/index.php/2008/10/31/linq-to-object-vs-foreach/

    hat mich das Interesse daran gepackt, warum LINQ nur so unglaublich schnell ist.
    Eventuell können wir hier mal darüber diskutieren, oder Links posten, wo etwas mehr über die Implementation von den LINQ-Ausdrücken geredet wird als in der kleinen MS-Doku. Vielleicht kann mir ja auch jemand erklären woher diese enorme Geschwindigkeit kommt.



  • Linq führt die Anfrage erst aus wenn die Daten benötigt werden was in Deinem Demolink nicht der Fall ist.



  • Achso, du meinst First() , FirstOrDefault() und Konsorten?



  • Firefighter schrieb:

    Achso, du meinst First() , FirstOrDefault() und Konsorten?

    Count oder foreach
    Probier das Demo mal mit einer Zuweisung des Linq-Ausdruckes an eine andere Variable



  • Ahh natürlich.Aber was mir nicht so ganz klar ist. Die Abfrage der foreach und die des LINQ in meinem Link machen doch eigentlich das selbe oder irre ich mich da? Beide vergleichen ein string-objekt auf einen bestimmten Inhalt, wo geht hier also die Geschwindigkeit verloren?



  • Die Vergleichsabfrage wird gespeichert aber nicht ausgeführt, da das Ergebnis nicht angefordert wird.



  • sw.Reset();
                sw.Start();
                var matchesLinq = (from s in names
                where s.StartsWith("d")
                select s);
    
                int cnt = matchesLinq.Count();
    
                sw.Stop();
                Console.WriteLine("linq to object: {0}",
                          sw.Elapsed.TotalMilliseconds);
    

    => foeach: 219ms
    => linq: 271ms



  • OMG.Das haut mich um.Wenn ich ein Count() mache, dann ist LINQ sogar langsamer.Folgende Ausgabe erhalte ich dadurch:
    **
    standard foreach: 172,1823
    linq to object: 193,7243**

    edit:hrrr zu langsam...



  • Firefighter schrieb:

    edit:hrrr zu langsam...

    Dafür ist Dein Rechner schneller. 🙂



  • Hmm da haste wohl recht.die frage die sich mir aber nun stellt. Ich kann ja nun nicht jedesmal einen Zeitvergleich machen wenn ich eine Collection oder ähnliches auf bestimmte eigenschaften abfragen will. Wie kann ich nun unterscheiden wann LINQ und wann foreach angebracht ist? gibt es da ne "Regel" oder sowas woran man sich ableiten kann wann was angebracht ist?



  • Ich persönlich denke nicht dass die Geschwindigkeit das oberste Kriterium einer Softwareentwicklung ist. Ich mache das jetzt seit 15 Jahren und denke dass Kapselung, Wiederverwendbarkeit, Stabilität usw viel wichtiger für den Kunden und einem selbst ist. Ich mache zu 90% Datenbankanwendungen wo es für den Kunden das Beste ist meinetwegen 30% mehr Leistung zu fordern aber damit schneller mit den Projekten durch zu sein und damit preiswerter zu sein. Wobei ich damit nicht meine dass die Qualität der Software darunter leiden sollte.



  • Ok ich danke dir witte.Was die Wiederverwendbarkeit und übersichtlichkeit angeht, ist LINQ also doch besser geeignet.Ich danke dir, das du mich an deiner Erfahrung hast teilhaben, das hilft immer mehr als jeglicher Code 😉


Log in to reply