Beim Erstellen von LINQ-Ausdrücken (für mich, linq to objects) gibt es viele Möglichkeiten, etwas zu erreichen, einige viel, viel besser und effizienter als andere.Was ist der beste Weg, LINQ-Ausdrücke zu optimieren oder zu "tunen"?
- Gibt es eine gute Möglichkeit, diese Ausdrücke zu "tunen" oder zu optimieren?
- Welche grundlegenden Metriken verwenden Leute und wie sammeln Sie sie?
- Gibt es eine Möglichkeit, um "Total Iterations" oder eine andere Metrik zu erhalten, wo Sie wissen könnten, dass niedriger bedeutet besser?
EDIT
Dank Richard/Jon für Ihre Antworten.
Was ich wirklich will, ist eine Möglichkeit, eine einfache Operation Count "OCount" für einen LINQ-Ausdruck zu bekommen, obwohl ich nicht sicher bin, dass die Haken in LINQ existieren, um es zu erlauben. Angenommen, ich habe ein bestimmtes Leistungsniveau für eine bestimmte Maschinenhardware (ein SLA). Idealerweise würde ich einen Komponententest hinzufügen, um zu bestätigen, dass die typischen Daten, die durch diese Abfrage verschoben wurden, innerhalb der zugewiesenen Zeit (aus dem SLA) verarbeitet werden. Problem ist, dass dies auf dem Build-Server/Entwickler-Rechner/etc ausgeführt werden würde. was wahrscheinlich wenig Ähnlichkeit mit der Maschinen-Hardware des SLA hat. Also die Idee ist, dass ich einen akzeptablen maximalen "OCount" für den Ausdruck bestimmen würde, wissend, dass, wenn der OCount kleiner als X ist, er sicherlich akzeptable Leistung unter dem SLA auf der "typischen" Zielhardware bereitstellen wird. Wenn der OCount diesen Schwellenwert überschreitet, würde der Build/Unit-Test eine Warnung generieren. Im Idealfall würde Ich mag so etwas wie dieser (Pseudo-Code-ish) haben:
var results = [big linq expression run against test dataset];
Assert.IsLess(MAXALLOWABLE_OCOUNT, results.OCount)
wo results.OCount würde einfach geben Sie mir die Gesamt Iterationen (n) notwendig, um die Ergebnismenge zu erzeugen.
Warum würde ich das mögen ??
Nun, selbst mit einem LINQ-Ausdruck mittlerer Größe kann eine kleine Änderung/Addition RIESIGE Auswirkungen auf die Leistung als Folge der Erhöhung der Gesamtzahl der Operationen haben. Der Anwendungscode würde immer noch alle Komponententests bestehen, da er immer noch das korrekte Ergebnis liefert, aber bei der Bereitstellung kläglich langsam arbeitet.
Der andere Grund ist für einfaches Lernen. Wenn Sie etwas tun und der OCount um eine Größenordnung nach oben oder unten geht, dann lernen Sie etwas.
EDIT # 2 Ich werde auch eine mögliche Antwort werfen. Es ist nicht meins, es kommt von Cameron MacFarland von einer anderen Frage, die ich fragte, die dieses hervorbrachte. Es stellt sich heraus, dass die Antwort hier in einer Unit-Test-Umgebung funktionieren könnte, wie sie in der ersten Bearbeitung dieser Frage beschrieben wurde.
Die Essenz davon wäre, die Testdatensätze in der Unit Test Fixture zu erstellen, die Sie in den LINQ-Ausdruck in der in dieser Antwort skizzierten Weise einspeisen und dann die Iterationszahlen addieren und mit der maximal zulässigen Iterationszahl vergleichen.
Siehe Cameron's answer here