Was ist eine faule Initialisierung und warum ist sie nützlich?
Was ist faul Initialisierung von Objekten? Wie machst du das und was sind die Vorteile?
InformationsquelleAutor der Frage SNA | 2009-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lazy-Initialisierung ist ein performance-Optimierung, wo Sie aufschieben (eventuell teuren) Objekt-Erstellung, bis Sie es wirklich benötigen.
Ein gute Beispiel ist nicht eine Datenbank-Verbindung vorne, aber nur knapp, bevor Sie brauchen, um Daten aus der Datenbank.
Der Hauptgrund dafür ist, dass (oft) Sie können vermeiden, das Objekt vollständig, wenn Sie es niemals brauchen.
InformationsquelleAutor der Antwort Bevan
Wie andere erwähnt haben, ist die verzögerte Initialisierung verzögert Initialisierung einer Komponente oder Objekt verwendet wird. Sie können anzeigen, lazy-Initialisierung als runtime-Anwendung der YAGNI-Prinzip - "
You ain't gonna need it
"Die Vorteile aus der Perspektive der Anwendung von lazy initialization, dass die Nutzer nicht zahlen müssen, um die Initialisierung Zeit für Funktionen, die Sie nicht verwenden. Angenommen, Sie wurden initialisiert jede Komponente Ihrer Anwendung vor. Dies könnte ein potenziell lange Startzeit - Nutzer müssen warten Dutzende von Sekunden oder Minuten, bevor Sie Ihre Anwendung sofort einsatzbereit ist. Sind Sie das warten auf und bezahlen für die Initialisierung der features, die Sie vielleicht nie nutzen oder nicht sofort verwenden.
Statt, wenn Sie verzögern die Initialisierung dieser Komponenten bis zur Verwendung der Zeit, wird die Anwendung starten viel schneller. Wird der Nutzer noch zu zahlen haben, die startup-Kosten bei der Verwendung von anderen Komponenten, aber die Kosten amortisieren sich über die von der Anwendung ausgeführt und nicht kondensierte sich in den Anfang, und den Benutzer zuordnen können die Initialisierung dieser Objekte mit den Funktionen, die Sie verwenden.
InformationsquelleAutor der Antwort Michael
Lazy-Initialisierung ist das Konzept der Vertagung der Objekt-Erstellung, bis das Objekt tatsächlich zum ersten mal benutzt. Wenn richtig eingesetzt, kann es zu erheblichen performance-Gewinne.
Persönlich, ich habe Lazy-Initialisierung beim erstellen meiner eigenen hand gerollt ORM .NET 2.0. Beim laden meiner Sammlungen aus der Datenbank, die eigentlichen Elemente in der Sammlung wurden lazy initialisiert. Dies bedeutete, dass die Sammlungen wurden schnell erstellt, aber jedes Objekt nur geladen, wenn ich es verlangt.
Wenn Sie vertraut sind mit dem Singleton-Muster, Sie haben wahrscheinlich gesehen die verzögerte Initialisierung in Aktion als gut.
In diesem Fall, die Instanz von SomeClass wird erst initialisiert, ist es zunächst erforderlich, durch die SomeClassSingleton Verbraucher.
InformationsquelleAutor der Antwort Justin Niessner
Im Allgemeinen computing-Begriffe, 'lazy evaluation' Mittel zum verzögern der Bearbeitung auf etwas, bis Sie es wirklich benötigen. Die Grundidee ist, dass man manchmal vermeiden Sie kostspielige Operationen, wenn Sie drehen, um Sie nicht zu brauchen, oder wenn Sie den Wert ändern würde, bevor Sie es verwenden.
Ein einfaches Beispiel dafür ist System.Ausnahme.StackTrace. Dies ist eine string-Eigenschaft auf eine Ausnahme, aber es ist nicht wirklich gebaut, bis Sie darauf zugreifen. Intern bedeutet es sowas wie:
Dies erspart Ihnen den Aufwand der tatsächlich Berufung buildStackTrace, bis jemand sehen will, was es ist.
Eigenschaften sind eine Möglichkeit, um einfach diese Art von Verhalten.
InformationsquelleAutor der Antwort Dolphin
Lazy-Initialisierung eines Objekts bedeutet, dass seine Einrichtung verzögert wird, bis es zum ersten mal benutzt. (Für dieses Thema, die Begriffe verzögerte Initialisierung und verzögerte Instanziierung Synonym.) Lazy initialization ist in Erster Linie verwendet, um die Leistung zu verbessern, Vermeidung unnötiger Berechnungen, und reduzieren die Programm-Speicher-Anforderungen. Dies sind die häufigsten Szenarien:
Wenn Sie ein Objekt haben, das ist aufwendig zu erstellen, und das Programm kann nicht verwenden es. Nehmen wir beispielsweise an, dass Sie im Speicher ein Customer-Objekt, das eine Bestellungen-Eigenschaft enthält eine große Auswahl, Um Objekte, die initialisiert werden, benötigt eine Datenbankverbindung. Wenn der Benutzer fragt niemals Aufträge anzeigen oder die Daten in eine Berechnung, dann gibt es keinen Grund für die Verwendung von system-Speicher oder computing-Zyklen, um es zu schaffen. Durch die Verwendung von Faul zu erklären, dass die Bestellungen Objekt für die verzögerte Initialisierung, können Sie vermeiden, verschwenden Sie Systemressourcen, wenn das Objekt nicht benutzt wird.
Wenn Sie ein Objekt haben, das ist aufwendig zu erstellen, und Sie möchten, zu verschieben, seine Schöpfung erst, nachdem andere teure Operationen abgeschlossen haben. Nehmen Sie beispielsweise an, Ihr Programm lädt mehrere Objekt-Instanzen, wenn es beginnt, aber nur einige von Ihnen sofort benötigten. Sie können zur Verbesserung der startup-performance des Programms durch das zurückstellen der Initialisierung der Objekte, die nicht erforderlich sind, bis die gewünschten Objekte erstellt wurden.
Obwohl Sie können schreiben Sie Ihren eigenen code, um die verzögerte Initialisierung, empfehlen wir, dass Sie Faul statt. Faul und seine verwandten Arten auch support thread-Sicherheit und stellen eine konsistente exception-propagation-Politik.
InformationsquelleAutor der Antwort Rakesh Kumar
Als das, was ich verstanden habe über lazy init so weit, ist, dass das Programm nicht laden/Anfrage alle Daten, die ein einmal. Es wartet für die Verwendung von es, bevor Sie es anfordern von zB. ein SQL-server.
Wenn Sie eine Datenbank mit einem großen Tisch trat, mit einer großen Menge von Untertabellen und Sie nicht, müssen die Angaben trat von der anderen Tabellen, es sei denn, Sie in "Bearbeiten" oder "view details", dann Lazy Init. helfen Sie die Anwendung, um schneller zu fahren und die ersten "lazy load" die detailsdata nach Bedarf.
In SQL oder LINQ können Sie diese "Einstellung" auf Ihre Datenbank-Modell der pr. Datenelement.
Hoffe, dass dies keinen Sinn macht, auf deine Frage?
Einen webclient (zB. ein browser) nicht die gleiche Sache. Die Bilder sind "lazy geladen", nachdem der HTML-und AJAX ist auch eine "Art lazy init", wenn richtig eingesetzt.
InformationsquelleAutor der Antwort BerggreenDK
Die Datenbank-Beispiele, die erwähnt wurden, sind so weit gut, aber es ist nicht nur auf den data access layer. Sie konnte gelten die gleichen Grundsätze auf jede situation, wo die Leistung oder der Speicher kann ein Problem sein. Ein gutes Beispiel (obwohl nicht .NET) ist im Kakao, wo Sie können warten, bis die Anfragen der Benutzer ein Fenster, um tatsächlich zu laden (und Ihre zugeordneten Objekte) aus der nib. Dies kann helfen, die Speicherauslastung nach unten und die Geschwindigkeit der erstmaligen Anwendung laden, vor allem, wenn Sie reden über Dinge wie windows-Einstellungen, die nicht benötigt werden, bis einige Zeit später, wenn überhaupt.
InformationsquelleAutor der Antwort Marc Charbonneau
Lesen Sie hier, Lazy Initialisierung mit Beispiel-code.
InformationsquelleAutor der Antwort Amir Rezaei
InformationsquelleAutor der Antwort Karthik Krishna Baiju