2010-12-26 6 views
10

Diese Frage here vor gefragt, aber keine der Antworten wirklich versucht, die eigentliche Frage nicht beantwortet zu werden, so dass ich es auf eine andere Art und Weise zu fragen. Ist das Laden einer einzelnen Klasse von 20.000 Zeilen mit 100 s Funktionen in irgendeiner Weise ressourcenintensiver als das Aufteilen des Codes in kleinere Klassen mit weniger Funktionen und das Laden dieser kleineren Klassen nach Bedarf?„Auswirkungen auf die Leistung“ bei der Verwendung war ein 20K Linien einzelne Klasse

+4

Offensichtlich (wenn Sie zögern, die große Klasse in kleinere zu brechen) Dies hängt vom Anwendungsfall ab. Wenn Sie sie aufteilen und nur 1% davon verwenden und nur diese 1% laden, ist es natürlich weniger ressourcenintensiv als das Laden von 100% und dann das Verwenden von 1%. – houbysoft

+1

Sie fragen hier zwei verschiedene Dinge. Der "Performance Impact" ist Zilch. Während "ressourcenintensiv", ja ist es, Speicher-weise. Wenn Sie Ihren Code in kleinere Teile aufteilen, haben Sie weniger Speicherverbrauch, aber möglicherweise mehr E/A. Verwenden Sie xdebug anstelle von generalisierter Beratung. – mario

+3

Leistung sollte hier nicht Ihr Problem sein ... die Vorteile, die Sie in Wartbarkeit ernten und in der Lage sein werden, den Code zu lesen, werden erheblich (wahrscheinlich geringe) Leistungseinbußen überwiegen, die auftreten könnten. – Thanatos

Antwort

6

Je größer ein Skript oder eine Klasse ist, desto mehr Speicher wird pro Instanz verwendet. Out-of-the-Box, PHP hat keine Möglichkeit, den Speicherplatz von Bibliotheken und Klassen zu teilen, so massive Skripte für eine Website zu erstellen ist keine gute Idee.

sollte Der typische Ansatz Klassen brechen in Blöcke, so dass Sie nur per Skript enthalten müssen, was Sie wirklich brauchen dieses Skript auszuführen.

Außerdem ist es unwahrscheinlich, dass Sie Performance-Probleme verursachen, wenn Sie eine riesige Menge an Verkehr haben - und dann könnten Sie wahrscheinlich Ihre Probleme einfacher als Refactoring Klassen beheben.

Wenn ein Skript geladen wird, benötigt es eine bestimmte Menge an Speicher, um es zu parsen. Je größer es ist, desto mehr Speicher benötigt es. Als nächstes wird das Skript selbst ausgeführt, wobei ein Code der obersten Ebene ausgeführt wird (nicht in einer Klasse oder globalen Funktion ). Wenn dies eine require/include-Anweisung enthält, werden diese Skripts geladen (falls erforderlich). Wenn es Objekte erstellt, benötigt das mehr Speicher.

Allerdings ist die Größe jeder Instanz der Klasse betroffen nur von den Daten, die sie speichert. Abgesehen von dieser Korrektur ist der Rat hier genau richtig: Teilen Sie Ihre Klassen nach Verantwortlichkeiten auf. Der Grund dafür liegt auch in der einfachen Entwicklung als in der Leistung. Angenommen, Sie haben eine Monsterklasse mit statischen Methoden gefüllt. Wenn Ihre Anwendung die meisten dieser Methoden für jede Anforderung verwendet, hat die Aufteilung keine Vorteile, da beide Skripts trotzdem geladen werden. Aber wenn Sie die Methoden in logische Subsysteme gruppieren können, sind sie leichter zu verstehen und zu bearbeiten.

+0

Einverstanden. Ein Mechanismus, der dies leicht machen kann (nachdem Sie Ihre Bibliothek in einzelne Klassen und Dateien unterteilt haben) ist PHP 5 [autoloading] (http://www.php.net/manual/en/language.oop5.autoload.php)). –

+0

@ Pekka, bitte nicht das A-Wort erwähnen. Ich hasse es offiziell, weil ich nicht ganz verstehe, wie man es hinzufügt. – jblue

+0

@jblue, sprichst du über "Autoloading"? Dafür gibt es ein paar nette Tutorials, falls Sie irgendwelche Probleme haben sollten. – shamittomar

4

Eine große Klasse erfordert einen einzigen Zyklus, um in binären Code (Op-Code) zu kompilieren.

Viele kleinere Klassen mit weniger Speicher benötigen aber mehr Kompilierung und die Speichernutzung für die Kompilierung wird akkumuliert werden.

Ist wirklich davon abhängig, wie viele Klassen/Dateien in der Laufzeit enthalten ist.

So Lösung für dieses, brechen in mehrere Klassen und APC oder gleichwertige verwenden.

PS: der Speicherverbrauch für die große Datei ist viel kleiner, weil PHP müssen, um die Quelle in Op-Code nicht erneut kompilieren