Frage

Neue Gespräche mit Kollegen haben unterschiedliche Standpunkte zu diesem Thema produziert. Was sagen Sie dazu, SO Mitglieder?

Ich weiß, auch das Konzept der Skalierbarkeit kann in so viele verschiedene Möglichkeiten und Kontexte genommen werden, aber dass ein Teil der Diskussion war, als dieses kam. Jeder schien eine andere Perspektive auf das, was die Skalierbarkeit wirklich bedeutet. Ich bin gespannt, die Variierung nimmt auch hier zu sehen. In der Tat habe ich geschrieben eine Frage nur für diesen Begriff.

War es hilfreich?

Lösung

Ich würde vermuten, dass der beste Weg durch das Schreiben Benchmarks zu überprüfen ist, aber meiner Meinung nach hat LINQ die Möglichkeit für Optimierungen, die Handschrift ähnlicher Code nicht. Ich weiß nicht, wie gut es den Vorteil derer, nimmt noch.

LINQ können Sie sagen, was Sie wollen, nicht, wie es zu erzeugen. Ein offensichtlicher Vorteil ist, dass LINQ automatisch parallelizable ist (siehe PLINQ ).

Ein weiterer Vorteil LINQ ist, dass es faul ist, so können Sie Berechnungen durchführen können, aus der Sammlung Zeichnung nach Bedarf. Sie könnten ein Äquivalent von Hand-Code, aber es kann viel einfacher sein Recht in LINQ zu erhalten.

Andere Tipps

Bei den Versuchen wir, LINQ to Objekte (ForEach) etwa 2x mal langsamer dann foreach-Schleife.

LINQ to SQL (MS SQL-Datenbank) ist fast 10x langsamer als die direkte Abfrage Datenleser, die meiste Zeit mit SQL aus Ausdrucksbaum zu schaffen (so werden Sie die CPU gebunden und Datenbank sein wird im Leerlauf) Um dies zu vermeiden, müssen Sie Abfragen kompiliert verwenden.

sehen Sie diese mehr. Die meisten Informationen in der Post ist mit .NET 3.5 SP1 noch gültig ist.

Diese Frage ist ein wenig wie zu fragen: „Wie skalierbar sind Sammlungen?“

Lassen Sie uns nur über LINQ zu Objekten sprechen. Im Allgemeinen in dem Maße, dass die meisten Implementierungen von IEnumerable<T> jedes Element in der zugrunde liegenden Sammlung iterieren, hat LINQ großes Potenzial schlecht zu skalieren. Erstellen Sie eine List<Foo>, die zehn Millionen Artikel und so etwas wie diese enthält:

var list = from Foo f in fooList
           where f.Value = "Bar"
           select f;

wird langsam sein. Aber das ist wirklich nicht Schuld LINQ. Du bist derjenige, der es eine Liste von zehn Millionen Stück gab.

Sie damit umgehen die gleiche Art und Weise Sie damit umgehen würde, wenn LINQ noch nicht existierte. Durch Wörterbücher und SortedLists und dergleichen, die Hilfe bauen Sie den Suchraum abspecken

LINQ können verbessern Skalierbarkeit (na ja, machen Skalierbarkeit einfacher zu bekommen) über latente Abfrageausführung. Sie können eine naive Methode ersetzen, die eine Liste erstellt, filtert sie auf eine neue Liste, Filter, die auf eine neue Liste, usw. mit einer Reihe von LINQ-Abfragen:

var list1 = from Foo f in fooList where f.Value1 = "Bar" select f;
var list2 = from Foo f in list1 where f.Value2 = "Baz" select f;
var list3 = from Foo f in list2 where f.Value3 = "Bat" select f;

von denen alle über einen einzigen Durchlauf durch die zugrunde liegende Auflistung ausgeführt wird, wenn (und ob) es notwendig wird, über die endgültige Liste iterieren. aber Auch dies ist nichts Neues: Wenn Sie nicht LINQ hatte, würden Sie wahrscheinlich Ihre naive Methode mit einem am Ende zu ersetzen, die das gleiche tat. Aber LINQ macht es viel einfacher.

Meiner Meinung nach LINQ sollte die Dinge aus einem Entwicklungsstandpunkt vereinfachen, nicht Skalierbarkeit adressieren.

In der Tat macht LINQ Dinge so einfach durch eine Menge von Komplikationen unter der Decke versteckt, und es könnte führen, wenn verwendet unverantwortlich , um die Skalierbarkeit Probleme.

Beispiele gibt es zuhauf in anderen Antworten, aber zu erwähnen, der bedeutendste:

  • Wenn Sie eine Objektsammlung abfragen Sie seine Größe nicht außer Acht lassen können. Vielleicht ist es in dem Modell zu tun, mit LINQ, klang gut, wenn es ein paar Objekte waren abfragen ... aber wie die Größe wächst es wird deutlich, dass die Abfrage in der Datenbank geschehen soll, nicht im Modell.

  • Wenn Sie SQL mit LINQ sind autogenerating, soweit ich weiß, kann man nicht Ihre Datenbank Hinweise geben, wie Abfragen zu kompilieren, zum Beispiel WITH (NOLOCK). Als Ihre Tischgrößen wachsen, diese Probleme zu lösen in der Lage ist zwingend notwendig.

  • Ähnlich wie oben, aber vielleicht allgemeiner: wenn Sie Skalierbarkeitsprobleme über einen DB adressieren, Sie wurde zu kontrollieren, was die DB tut. Mit einer Sprache, die auf SQL kompiliert, die dann wieder auf einen Ausführungsplan erstellt wird, entfernt Kontrolle aus der Hand.

  • Was passiert, wenn Sie Ihre Datenbank-Schema, um sich ändern müssen, um sie besser skalierbar und Ihr Code ist es stark gebunden, weil Sie keine gespeicherten Prozeduren haben?

  • Obwohl es einfach scheint, kann man nicht LINQ-Anbieter, ohne große Schmerzen ändern: SQL Server Abfrage ist nicht das gleiche Objekt wie das Abfragen oder als XML-Abfragen. Die LINQ ist aber sehr ähnlich. Ich mache einige meines Junior-Entwickler erwartet, auf einer „LINQ spree“ zu gehen, weil es einfacher ist, als zu lernen, wie die Dinge im Auge mit Skalierbarkeit zu tun.

Abschließend denke ich, dass es möglich ist, skalierbare Code mit LINQ zu schreiben, aber nur indem sie sie mit guter Pflege verwenden. Es gibt keinen Killer Tools , nur Killer Code .

Es hängt stark von der LINQ-Provider Sie verwenden und wie Sie es verwenden. LINQ ist wahrscheinlich nicht für erstaunliche Ausführungsgeschwindigkeit wissen, sondern vielmehr bietet Entwicklern eine wesentlich bessere Produktivität.

Nach dieser Link auch mit einigen des CTPs Linq to SQL war schon besser als in einigen Fällen direkte SQL.

Wenn Sie befassen sich mit Geschwindigkeit und sind mit LINQ zu Objekten alot hier ist ein Codeplex-Projekt ( glaube ich) für einen Anbieter, die Ihnen 1000x Leistungsverbesserungen geben können.

Ihre Frage über die Skalierbarkeit in gewisser Weise hängt davon ab, was Sie mit LINQ für. In Business-Anwendungen, Sie gehen nicht viele SQL-Befehle finden ausgeführt werden - sie sind langsam und haben im DBMS kompiliert werden. Was Sie stattdessen sind viele Stored Procedure Anrufe sehen. Diese werden etwas schneller in LINQ.

Beachten Sie, dass LINQ to SQL und dergleichen Aufeinander ADO.NET gebaut werden - sie sind nicht eine völlig andere Methode oder sonst etwas. Sicher, LINQ to XML werden verschiedene APIs unter der Decke verwenden. Dies wird wie ein Compiler viel sein -. Gibt es immer einige Optimierungen Menschen, dass schneller sein könnte machen können, aber zum größten Teil werden diese APIs der Lage sein, schneller und weniger fehlerhaften Code zu erzeugen, als Code, den Sie selbst schreiben

In Bezug auf die horizontale Skalierung, können Sie immer LINQ hinter einem Web-Service setzen, wenn Sie Ihre Daten ein wenig verteilen möchten oder können Sie SQL Server-Replikation verwenden. Es sollte nicht weniger skalierbar sein als ADO.NET wäre.

Skalierbarkeit und Leistung sind zwei unterschiedliche, aber miteinander verbundene Dinge. Wenn Sie die Leistung messen wollen, müssen Sie sehen, wie viele Nutzer (zum Beispiel) Sie mit einem Kasten unterstützen können. Wenn Sie Skalierbarkeit messen fügen Sie ein anderes Feld und sehen, ob Sie die doppelten ursprünglichen Betrag unterstützen können? Wahrscheinlich nicht, und man könnte nur hinzufügen 75% auf Ihre Rechenleistung, fügt nächste nur 50% der ursprünglichen Einheit, und so geht es bis auf Null ziemlich schnell. Egal, wie viele Boxen Sie zu diesem Satz hinzufügen, haben Sie Glück, die unterstützte Benutzeranzahl zu verdoppeln. Das ist die Skalierbarkeit.

Wie Sie Ihre Linq Modul Waage hängt wahrscheinlich mehr auf der Datenbank, wie mächtig die Maschine ist, was das Design der Datenbank ist, was ist das Design Ihrer Anwendung.

Sie sehen oft Mikro-Benchmarks, die angeblich etwas schlüssig offenbaren, aber sie tun nicht, weil sie nur Schlüsselloch Blick auf das ganze Problem sind.

Sie können das gute alte 20/80 Beispiel ziehen hier. Es ist wahrscheinlich 20% über das Werkzeug und 80% über alle Arten von tangibles, die Ihre Anwendung bilden.

Wenn Sie sich für ein richtiges Beispiel suchen, verwendet Linq Stackoverflow stark, lesen Sie in diesem post / Podcast .

Es gibt einen Preis für das Caching und Laden von Objekten auf Abruf die Linq to SQL-Framework. Wenn ein Objekt kann faul Last Teile selbst auf Nachfrage, ist es sehr wahrscheinlich, dass es ein Verweis auf den Datenkontext innerhalb jeden Objekts. Nebenbei bemerkt, dass die Daten Kontext-Caches auch jedes Objekt, das jemals von ihm angefordert. Was bedeutet, dass, wenn Sie eines Ihrer Objekte halten um (entweder in einem Cache oder gerade weil Sie es später zu verwenden), Sie sind nicht nur auf das Objekt halten, aber jedes Objekt, das jemals von der Datenkontext angefordert. Diese werden nie Müll gesammelt, weil sie immer noch das verwiesen wird.

Das ist kein Problem, wenn Sie alle Ihre Ziele eine kurze Lebensdauer haben und die Anwendung schafft neue Datacontexts jedes Mal es neue Arbeit macht. Aber ich kann sehen, wie es Probleme Skalierbarkeit schaffen könnte, wenn jemand keine Kenntnis von der zusätzlichen Belastung reitet zusammen mit jedem Objekt.

Linq ist scalabile in vielerlei Hinsicht.

Ein Aspekt ist Spezifikation Implementierung hinter Linq, die Expression von Prozess ausgeführt interpretiert werden kann, in einer anderen Sprache (Linq2Sql, Linq2Hibernate) oder in einem verteilten Computer invironment wie ein Karten reduzieren Cluster was das betrifft ( DryadLINQ )

Ein weiterer Aspekt ist die Semantik, dass Linq in die Sprache zur Verfügung stellt. Sie können ohne Füllung die Sammlung im Speicher durch Milliarden von Objekten iterieren, wenn Ihr Provider verzögertes Laden unterstützt, oder Sie können die Abfrage (PLINQ oder i4o) paralellize oder optimieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top